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?



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', '')

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()

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


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


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', '')

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.


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()

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

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()])

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

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.


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

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()

2
f = open('data.txt','r')
string = ""
while 1:
    line = f.readline()
    if not line:break
    string += line

f.close()


print string

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) ]


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])


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()

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»]


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


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

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.


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

-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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.