Comment lire un fichier texte dans une variable chaîne et supprimer les retours à la ligne?

964

J'utilise le segment de code suivant pour lire un fichier en python:

with open ("data.txt", "r") as myfile:
    data=myfile.readlines()

Le fichier d'entrée est:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

et quand j'imprime des données, je reçois

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Comme je le vois, les données sont en listforme. Comment puis-je le faire en chaîne? Et comment puis-je supprimer les "\n", "["et les "]"personnages de lui?

klijo
la source
7
Le titre et la question sont incohérents. Voulez-vous vraiment vous débarrasser du \ n également?
Julian
2
voulez-vous vraiment supprimer les retours à la ligne du contenu du fichier / de la chaîne, ou êtes-vous simplement confus au sujet des nombreux méta-caractères dans votre sortie d'impression et voulez réellement garder les retours à la ligne, mais ne pas les afficher comme "\ n"?
mnagel
11
Pour ceux qui viennent ici d'un moteur de recherche, vous cherchez probablement la réponse de @ xiaoyu
Jonathan Sudiaman

Réponses:

1323

Vous pouvez utiliser:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')
Sleeplessnerd
la source
67
Y a-t-il un inconvénient à écrire à la open("data.txt").read().replace('\n','')place?
tuomassalo
263
Oui, votre version ne ferme pas explicitement le fichier, qui sera ensuite retardé jusqu'à ce que le garbage collector s'exécute ou que le programme se termine. L'instruction 'with' encapsule généralement certaines actions d'ouverture / fermeture de configuration / démontage.
sleeplessnerd
12
Merci pour la clarification. Donc, il semble que ma version soit correcte pour les petits scripts - mais OTOH, il vaut mieux l'éviter complètement pour ne pas en faire une habitude.
tuomassalo
10
@tuomassalo c'est un énorme PITA dans le processus de test / débogage, car il ne nettoiera pas les descripteurs de fichiers ouverts si vous devez vous arrêter prématurément ou s'il rencontre une exception.
GoingTharn
13
Non, rstrip('\n')ne supprimera que la nouvelle ligne de la dernière ligne, la replace('\n','')supprimera partout (en faisant essentiellement le fichier entier sur une ligne)
sleeplessnerd
632

N'utilisez read()pas readline():

with open('data.txt', 'r') as myfile:
  data = myfile.read()
xiaoyu
la source
6
Peut-être, mais cela ne supprime pas les nouvelles lignes comme le souhaitait l'OP. Je l'aime encore malgré çà.
Randall Cook
60
Si vous renvoyez une seule chaîne, supprimer les sauts de ligne n'a aucun sens - l'OP doit choisir une chaîne ou supprimée \ n dans les chaînes de la liste.
Alex Dupuy
Fonctionne mais pas les fichiers Unicode. Pour prendre en charge utf8 sur python3, utilisez un argument supplémentaireencoding="utf-8"
FindOutIslamNow
2
Je ne comprends pas pourquoi cette solution a été publiée et elle reçoit également autant de votes positifs. C'est fondamentalement la même que celle acceptée il y a plus d'un an, et il manque même la nouvelle partie de décapage de ligne, ce qui rend encore moins utile ..
nnsense
65

Vous pouvez lire à partir d'un fichier sur une seule ligne:

str = open('very_Important.txt', 'r').read()

Veuillez noter que cela ne ferme pas le fichier explicitement.

CPython fermera le fichier à sa sortie dans le cadre de la récupération de place.

Mais les autres implémentations de python ne le feront pas. Pour écrire du code portable, il est préférable d'utiliser withou de fermer le fichier explicitement. Court n'est pas toujours mieux. Voir https://stackoverflow.com/a/7396043/362951

Nafis Ahmad
la source
32
Ceci est anti-idiomatique et non recommandé. opendoit être utilisé dans une with ... asinstruction.
Jorge Leitao
1
@JC pouvez-vous expliquer le problème? Est-ce juste une question de coutume ou la with ... asdéclaration apporte-t-elle quelque chose?
Titou
4
@Titou, le problème est que open.read () ne ferme pas le fichier, nous avons donc besoin with ... asou str.close()comme démontré dans la réponse de Pedro. En savoir plus sur l'importance de fermer des fichiers ici
JBallin
@JBallin. Cet idiome supprime clairement une source d'erreur. Merci !
Titou
3
c'est aussi mauvais parce que vous venez str()de suivre les fonctions intégrées
Chris_Rands
50

Pour joindre toutes les lignes dans une chaîne et supprimer les nouvelles lignes que j'utilise normalement:

with open('t.txt') as f:
  s = " ".join([x.strip() for x in f]) 
CONvid19
la source
Il donne UnicodeDecodeError dans mon code Voir ce stackoverflow.com/q/18649512/9339242
Arayan Singh
vous devrez peut-être spécifier l'encodage des caractères.
CONvid19
45

Dans Python 3.5 ou version ultérieure, à l'aide de pathlib, vous pouvez copier le contenu d'un fichier texte dans une variable et fermer le fichier sur une seule ligne:

from pathlib import Path
txt = Path('data.txt').read_text()

puis vous pouvez utiliser str.replace pour supprimer les sauts de ligne:

txt = txt.replace('\n', '')
Jonathan Sudiaman
la source
31
with open("data.txt") as myfile:
    data="".join(line.rstrip() for line in myfile)

join () joindra une liste de chaînes, et rstrip () sans arguments supprimera les espaces, y compris les sauts de ligne, à la fin des chaînes.

MagerValp
la source
12

Cela peut être fait en utilisant la méthode read ():

text_as_string = open('Your_Text_File.txt', 'r').read()

Ou comme le mode par défaut lui-même est «r» (lecture), utilisez simplement,

text_as_string = open('Your_Text_File.txt').read()
Loochie
la source
9

J'ai bidouillé avec cela pendant un certain temps et j'ai préféré utiliser l'utilisation readen combinaison avec rstrip. Sans rstrip("\n"), Python ajoute une nouvelle ligne à la fin de la chaîne, ce qui dans la plupart des cas n'est pas très utile.

with open("myfile.txt") as f:
    file_content = f.read().rstrip("\n")
    print file_content
tourbillon
la source
6

Il est difficile de dire exactement ce que vous recherchez, mais quelque chose comme ça devrait vous aider à démarrer:

with open ("data.txt", "r") as myfile:
    data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])
Chris Eberle
la source
réduire (lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") est beaucoup plus cool: D
sleeplessnerdd
3
@Duncan que proposeriez-vous?
Chris Eberle
data = ' '.join(line.replace('\n', '') for line in myfile)ou la version de MagerValp.
Duncan
6

Je suis surpris que personne ne l'ait splitlines()encore mentionné .

with open ("data.txt", "r") as myfile:
    data = myfile.read().splitlines()

La variable dataest maintenant une liste qui ressemble à ceci une fois imprimée:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Notez qu'il n'y a pas de nouvelle ligne (\n ).

À ce stade, il semble que vous souhaitiez imprimer les lignes sur la console, ce que vous pouvez réaliser avec une boucle for:

for line in data:
    print line
julien
la source
4

Vous pouvez également supprimer chaque ligne et concaténer dans une chaîne finale.

myfile = open("data.txt","r")
data = ""
lines = myfile.readlines()
for line in lines:
    data = data + line.strip();

Cela fonctionnerait également très bien.

Sai Kiriti Badam
la source
Merci Pedro. Je viens de l'ajouter par souci de compréhension.
Sai Kiriti Badam
3

vous pouvez compresser cela en une à deux lignes de code !!!

content = open('filepath','r').read().replace('\n',' ')
print(content)

si votre fichier se lit:

hello how are you?
who are you?
blank blank

sortie python

hello how are you? who are you? blank blank
Michael Smith
la source
3

Il s'agit d'une solution à copier-coller d'une ligne qui ferme également l'objet fichier:

_ = open('data.txt', 'r'); data = _.read(); _.close()
Edward D'Souza
la source
2
f = open('data.txt','r')
string = ""
while 1:
    line = f.readline()
    if not line:break
    string += line

f.close()


print string
Hungneox
la source
2
Les boucles qui ont un string += linedoivent être évitées. Certaines versions de Python peuvent réussir à éviter le comportement de O (n ^ 2) ici, mais toutes les autres réponses qui ont été données sont meilleures que cela. De plus, vous n'avez pas supprimé les sauts de ligne qui ont été demandés, donc votre code est juste un moyen très lent de le fairestring = f.read()
Duncan
Merci de me corriger. Mais une petite chose est que je n'ai pas à supprimer la nouvelle ligne, car lorsque j'ai testé, elle n'a pas imprimé '\ n'. @Duncan
hungneox
2

python3: Google "list comphrension" si la syntaxe entre crochets est nouvelle pour vous.

 with open('data.txt') as f:
     lines = [ line.strip( ) for line in list(f) ]
gerardw
la source
2

Avez-vous essayé cela?

x = "yourfilename.txt"
y = open(x, 'r').read()

print(y)
Thorax The PyChangeling
la source
1
C'est faux. Vous voulez y = open (x, 'r'). Read () si vous voulez le faire de cette façon.
Katastic Voyage
1

Je ne pense pas que quiconque ait répondu à la partie de votre question. Lorsque vous avez lu chaque ligne dans votre variable, car il y avait plusieurs lignes avant de remplacer le \ n par '', vous avez fini par créer une liste. Si vous avez une variable de x et l'imprimez juste en

X

ou imprimer (x)

ou str (x)

Vous verrez la liste entière avec les crochets. Si vous appelez chaque élément du (tableau de sortes)

x [0] puis il omet les crochets. Si vous utilisez la fonction str (), vous ne verrez que les données et non le '' non plus. str (x [0])

John Galbraith
la source
1

Vous pourriez peut-être essayer ça? J'utilise cela dans mes programmes.

Data= open ('data.txt', 'r')
data = Data.readlines()
for i in range(len(data)):
    data[i] = data[i].strip()+ ' '
data = ''.join(data).strip()

la source
1

L'expression régulière fonctionne aussi:

import re
with open("depression.txt") as f:
     l = re.split(' ', re.sub('\n',' ', f.read()))[:-1]

print (l)

[«Je», «sentir», «vide», «et», «mort», «à l'intérieur»]

Alex
la source
1

Pour supprimer les sauts de ligne à l'aide de Python, vous pouvez utiliser la replacefonction d'une chaîne.

Cet exemple supprime les 3 types de sauts de ligne:

my_string = open('lala.json').read()
print(my_string)

my_string = my_string.replace("\r","").replace("\n","")
print(my_string)

Exemple de fichier:

{
  "lala": "lulu",
  "foo": "bar"
}

Vous pouvez l'essayer en utilisant ce scénario de relecture:

https://repl.it/repls/AnnualJointHardware

entrez la description de l'image ici

Sma Ma
la source
0

Cela fonctionne: changez votre fichier en:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Alors:

file = open("file.txt")
line = file.read()
words = line.split()

Cela crée une liste nommée wordségale à:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Cela s'est débarrassé du "\ n". Pour répondre à la partie sur les crochets qui vous gênent, faites simplement ceci:

for word in words: # Assuming words is the list above
    print word # Prints each word in file on a different line

Ou:

print words[0] + ",", words[1] # Note that the "+" symbol indicates no spaces
#The comma not in parentheses indicates a space

Cela renvoie:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE
PyGuy
la source
1
La modification du fichier peut fonctionner dans une situation ponctuelle, mais si vous avez des centaines de fichiers, ce n'est pas une solution viable.
Craicerjack
0
with open(player_name, 'r') as myfile:
 data=myfile.readline()
 list=data.split(" ")
 word=list[0]

Ce code vous aidera à lire la première ligne, puis en utilisant l'option liste et fractionnement, vous pouvez convertir le premier mot de ligne séparé par un espace à stocker dans une liste.

Vous pouvez alors accéder facilement à n'importe quel mot, ou même le stocker dans une chaîne.

Vous pouvez également faire la même chose en utilisant une boucle for.

Lakshaya Maheshwari
la source
0
file = open("myfile.txt", "r")
lines = file.readlines()
str = ''                                     #string declaration

for i in range(len(lines)):
    str += lines[i].rstrip('\n') + ' '

print str
akD
la source
-1

Essayez ce qui suit:

with open('data.txt', 'r') as myfile:
    data = myfile.read()

    sentences = data.split('\\n')
    for sentence in sentences:
        print(sentence)

Attention: Il ne supprime pas le \n. C'est juste pour voir le texte comme s'il n'y avait pas\n

Palak Jain
la source