Linux 从文件中读取行而不在末尾附加“\n”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11280282/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
to read line from file without getting "\n" appended at the end
提问by POOJA GUPTA
My file is "xml.txt" with following contents:
我的文件是“xml.txt”,内容如下:
books.xml
news.xml
mix.xml
if I use readline() function it appends "\n" at the name of all the files which is an error because I want to open the files contained within the xml.txt. I wrote this:
如果我使用 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
error encountered on running this code:
运行此代码时遇到错误:
IOError: [Errno 2] No such file or directory: 'books.xml\n'
采纳答案by Amber
To remove just the newline at the end:
只删除最后的换行符:
line = line.rstrip('\n')
The reason readline
keeps the newline character is so you can distinguish between an empty line (has the newline) and the end of the file (empty string).
readline
保留换行符的原因是您可以区分空行(有换行符)和文件末尾(空字符串)。
回答by Amber
You could use the .rstrip()
method of string objects to get a version with trailing whitespace (including newlines) removed.
您可以使用.rstrip()
字符串对象的方法来获取删除尾随空格(包括换行符)的版本。
E.g.:
例如:
find_root(file.rstrip())
回答by John La Rooy
It's better style to use a context manager for the file, and len()
instead of calling .__len__()
为文件使用上下文管理器是更好的风格,而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
回答by Abhishek Gupta
To remove the newline character fro the end you could also use something like this:
要从末尾删除换行符,您还可以使用以下内容:
for line in file:
print line[:-1]
回答by Daniel F
From Best method for reading newline delimited files in Python and discarding the newlines?
从在 Python 中读取换行符分隔文件并丢弃换行符的最佳方法?
lines = open(filename).read().splitlines()
回答by justengel
I timed it just for curiosity. Below are the results for a vary large file.
我只是为了好奇而计时。以下是不同大文件的结果。
tldr; File read then split seems to be the fastest approach on a large file.
tldr; 文件读取然后拆分似乎是处理大文件的最快方法。
with open(FILENAME, "r") as file:
lines = file.read().split("\n")
However, if you need to loop through the lines anyway then you probably want:
但是,如果您无论如何都需要遍历这些行,那么您可能需要:
with open(FILENAME, "r") as file:
for line in file:
line = line.rstrip("\n")
Python 3.4.2
蟒蛇 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()
Results:
结果:
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
File read then split seems to be the fastest approach on a large file.
文件读取然后拆分似乎是处理大文件的最快方法。
Note: read then split("\n") will have an extra empty string at the end of the list.
注意: read then split("\n") 将在列表末尾有一个额外的空字符串。
Note: read then splitlines() checks for more then just "\n" possibly "\r\n".
注意:阅读然后 splitlines() 检查更多然后只是“\n”可能是“\r\n”。
回答by daemonsl
# mode : 'r', 'w', 'a'
f = open("ur_filename", "mode")
for t in f:
if(t):
fn.write(t.rstrip("\n"))
"If" condition will check whether the line has string or not, if yes next line will strip the "\n" at the end and write to a file. Code Tested. ;)
“If”条件将检查该行是否有字符串,如果是,下一行将去掉末尾的“\n”并写入文件。代码测试。;)
回答by downtheroad
A use case with @Lars Wirzenius's answer:
@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"