Mon fichier est "xml.txt" avec le contenu suivant:
books.xml
news.xml
mix.xml
si j'utilise la fonction readline (), il ajoute "\ n" au nom de tous les fichiers, ce qui est une erreur car je souhaite ouvrir les fichiers contenus dans le fichier xml.txt J'ai écrit ceci:
fo = open("xml.tx","r")
for i in range(count.__len__()): #here count is one of may arrays that i'm using
file = fo.readline()
find_root(file) # here find_root is my own created function not displayed here
erreur rencontrée lors de l'exécution de ce code:
IOError: [Errno 2] No such file or directory: 'books.xml\n'
Pour ne supprimer que la nouvelle ligne à la fin:
line = line.rstrip('\n')
La raison pour laquelle readline
conserve le caractère de nouvelle ligne est afin que vous puissiez faire la distinction entre une ligne vide (a la nouvelle ligne) et la fin du fichier (chaîne vide).
lines = open(filename).read().splitlines()
Vous pouvez utiliser la méthode .rstrip()
des objets chaîne pour obtenir une version avec la suppression des espaces, ainsi que des espaces.
Par exemple.:
find_root(file.rstrip())
Pour supprimer le caractère de nouvelle ligne de la fin, vous pouvez également utiliser quelque chose comme ceci:
for line in file:
print line[:-1]
Je l'ai chronométré juste par curiosité. Vous trouverez ci-dessous les résultats pour un fichier de grande taille.
tldr; La lecture d'un fichier puis sa division semble être l'approche la plus rapide pour un fichier volumineux.
with open(FILENAME, "r") as file:
lines = file.read().split("\n")
Cependant, si vous avez quand même besoin de parcourir les lignes, vous voudrez probablement:
with open(FILENAME, "r") as file:
for line in file:
line = line.rstrip("\n")
Python 3.4.2
import timeit
FILENAME = "mylargefile.csv"
DELIMITER = "\n"
def splitlines_read():
"""Read the file then split the lines from the splitlines builtin method.
Returns:
lines (list): List of file lines.
"""
with open(FILENAME, "r") as file:
lines = file.read().splitlines()
return lines
# end splitlines_read
def split_read():
"""Read the file then split the lines.
This method will return empty strings for blank lines (Same as the other methods).
This method may also have an extra additional element as an empty string (compared to
splitlines_read).
Returns:
lines (list): List of file lines.
"""
with open(FILENAME, "r") as file:
lines = file.read().split(DELIMITER)
return lines
# end split_read
def strip_read():
"""Loop through the file and create a new list of lines and removes any "\n" by rstrip
Returns:
lines (list): List of file lines.
"""
with open(FILENAME, "r") as file:
lines = [line.rstrip(DELIMITER) for line in file]
return lines
# end strip_readline
def strip_readlines():
"""Loop through the file's read lines and create a new list of lines and removes any "\n" by
rstrip. ... will probably be slower than the strip_read, but might as well test everything.
Returns:
lines (list): List of file lines.
"""
with open(FILENAME, "r") as file:
lines = [line.rstrip(DELIMITER) for line in file.readlines()]
return lines
# end strip_readline
def compare_times():
run = 100
splitlines_t = timeit.timeit(splitlines_read, number=run)
print("Splitlines Read:", splitlines_t)
split_t = timeit.timeit(split_read, number=run)
print("Split Read:", split_t)
strip_t = timeit.timeit(strip_read, number=run)
print("Strip Read:", strip_t)
striplines_t = timeit.timeit(strip_readlines, number=run)
print("Strip Readlines:", striplines_t)
# end compare_times
def compare_values():
"""Compare the values of the file.
Note: split_read fails, because has an extra empty string in the list of lines. That's the only
reason why it fails.
"""
splr = splitlines_read()
sprl = split_read()
strr = strip_read()
strl = strip_readlines()
print("splitlines_read")
print(repr(splr[:10]))
print("split_read", splr == sprl)
print(repr(sprl[:10]))
print("strip_read", splr == strr)
print(repr(strr[:10]))
print("strip_readline", splr == strl)
print(repr(strl[:10]))
# end compare_values
if __== "__main__":
compare_values()
compare_times()
Résultats:
run = 1000
Splitlines Read: 201.02846901328783
Split Read: 137.51448011841822
Strip Read: 156.18040391519133
Strip Readline: 172.12281272950372
run = 100
Splitlines Read: 19.956802833188124
Split Read: 13.657361738959867
Strip Read: 15.731161020969516
Strip Readlines: 17.434831199281092
run = 100
Splitlines Read: 20.01516321280158
Split Read: 13.786344555543899
Strip Read: 16.02410587620824
Strip Readlines: 17.09326775703279
La lecture de fichier puis la division semble être l'approche la plus rapide pour un fichier volumineux.
Remarque: read then split ("\ n") aura une chaîne vide supplémentaire à la fin de la liste.
Remarque: read then splitlines () recherche plus que "\ n" éventuellement "\ r\n".
Un cas d'utilisation avec la réponse de @Lars Wirzenius:
with open("list.txt", "r") as myfile:
for lines in myfile:
lines = lines.rstrip('\n') # the trick
try:
with open(lines) as myFile:
print "ok"
except IOError as e:
print "files does not exist"
Il vaut mieux utiliser un gestionnaire de contexte pour le fichier et len()
au lieu d'appeler .__len__()
.
with open("xml.tx","r") as fo:
for i in range(len(count)): #here count is one of may arrays that i'm using
file = next(fo).rstrip("\n")
find_root(file) # here find_root is my own created function not displayed here
# mode : 'r', 'w', 'a'
f = open("ur_filename", "mode")
for t in f:
if(t):
fn.write(t.rstrip("\n"))
La condition "If" vérifie si la ligne a une chaîne ou non, si oui, la ligne suivante enlève le "\ n" à la fin et écrit dans un fichier . Code testé. ;)