从Python中的文件读取行,而不会在结尾处追加“\ n”

我的文件是“xml.txt”,内容如下:

books.xml news.xml mix.xml 

如果我使用readline()函数,则会在所有文件的名称处附加“\ n”,这是因为我想打开xml.txt中包含的文件。 我写了这个:

 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 

运行此代码时遇到错误:

IOError:[Errno 2]没有这样的文件或目录:'books.xml \ n'

Solutions Collecting From Web of "从Python中的文件读取行,而不会在结尾处追加“\ n”"

最后删除换行符:

 line = line.rstrip('\n') 

readline保留换行符的原因是你可以区分一个空行(换行符)和文件末尾(空字符串)。

您可以使用字符串对象的.rstrip()方法来删除尾随空格(包括换行符)的版本。

例如:

 find_root(file.rstrip()) 

从最好的方法来阅读Python中的换行符分隔的文件,并放弃换行符?

 lines = open(filename).read().splitlines() 

对文件使用上下文管理器,使用len()而不是调用.__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 

要删除换行符到最后你也可以使用这样的东西:

 for line in file: print line[:-1] 

我只是为了好奇才计时。 以下是各种大文件的结果。

tldr; 文件读取然后拆分似乎是一个大文件上最快的方法。

 with open(FILENAME, "r") as file: lines = file.read().split("\n") 

但是,如果你需要循环线,那么你可能想要:

 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 __name__ == "__main__": compare_values() compare_times() 

结果:

 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 

文件读取然后拆分似乎是一个大文件上最快的方法。

注意:读取然后拆分(“\ n”)将有一个额外的空字符串在列表的末尾。

注意:读取然后splitlines()检查更多然后“\ n”可能“\ r \ n”。

@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" 
 # mode : 'r', 'w', 'a' f = open("ur_filename", "mode") for t in f: if(t): fn.write(t.rstrip("\n")) 

“如果”条件将检查该行是否有字符串,如果是,下一行将在最后剥去“\ n”并写入文件。 代码测试。 ;)