如何在没有换行符的情况下读取文件?
Posted
技术标签:
【中文标题】如何在没有换行符的情况下读取文件?【英文标题】:How to read a file without newlines? 【发布时间】:2012-09-02 01:41:10 【问题描述】:在 Python 中,调用
temp = open(filename,'r').readlines()
产生一个列表,其中每个元素都是文件中的一行。这有点愚蠢,但仍然:readlines()
还向每个元素写入换行符,这是我不希望发生的事情。
我该如何避免呢?
【问题讨论】:
使用条带:[l.strip('\n\r') for l in temp]
。甚至rstrip
。而且由于这里的迭代可以是in open
而不是in temp
。
如果在 Python 3 中有一个值可以将 open 的 newline
参数设置为 chomped 尾随换行符,那就太好了。
相关:***.com/questions/275018/…
【参考方案1】:
您可以使用str.splitlines
读取整个文件并拆分行:
temp = file.read().splitlines()
或者你可以手动去掉换行符:
temp = [line[:-1] for line in file]
注意:最后一种解决方案仅适用于文件以换行符结尾的情况,否则最后一行将丢失一个字符。
这种假设在大多数情况下都是正确的(尤其是对于由文本编辑器创建的文件,它们通常确实添加一个结束换行符)。
如果你想避免这种情况,你可以在文件末尾添加一个换行符:
with open(the_file, 'r+') as f:
f.seek(-1, 2) # go at the end of the file
if f.read(1) != '\n':
# add missing newline if not already present
f.write('\n')
f.flush()
f.seek(0)
lines = [line[:-1] for line in f]
或者更简单的替代方法是 strip
换行符:
[line.rstrip('\n') for line in file]
甚至,虽然很难读:
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
它利用了or
的返回值不是布尔值,而是被评估为真或假的对象这一事实。
readlines
方法实际上等价于:
def readlines(self):
lines = []
for line in iter(self.readline, ''):
lines.append(line)
return lines
# or equivalently
def readlines(self):
lines = []
while True:
line = self.readline()
if not line:
break
lines.append(line)
return lines
因为readline()
保留了换行符,readlines()
也保留了它。
注意:为了与readlines()
对称,writelines()
方法不添加结束换行符,因此f2.writelines(f.readlines())
在@ 中生成f
的精确副本987654339@.
【讨论】:
请注意[line.rstrip('\n') for line in file]
将删除多个尾随\n
。
更简单地说,[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
可以改为 [line[:-(line[-1] == '\n') or None] for line in file]
。
这些解决方案将整个文件读入内存。将列表理解的方括号更改为括号会生成一个生成器表达式,它允许您一次遍历文件一行:for line in (x.strip() for x in f):
@velotron 这并不是问题/答案的重点。另外:请记住,with
会在块终止时关闭文件,这意味着您不能在 with
之外执行 with open(...) as f: lines = (line for line in f)
和使用 lines
,因为您会收到 I/O 错误。你可以懒惰地使用 genexp,但你必须在关闭文件之前使用它。
@WesTurner。但不会有超过一个尾随换行符。额外的换行符将成为下一个空行的一部分【参考方案2】:
temp = open(filename,'r').read().splitlines()
【讨论】:
\r\n
换行符会发生什么? ;)
Python 自动处理通用换行符,因此.split('\n')
将正确拆分,独立于换行符约定。如果您以二进制模式读取文件会很重要。在这种情况下,splitlines()
处理通用换行符,而 split('\n')
不处理。
而且总是有os.linesep
:)
@LarsH,在某些情况下会有所帮助,在我的系统上,\r\n
行尾不转换为\n
,无论是读取为文本还是二进制,所以@ 987654329@ 可以在\n
不可用的地方工作。但是splitlines
显然是更好的选择,如果您提到文件与操作系统不匹配的位置。真的,我主要提到它,以防查看此讨论的人不知道它的存在。
@askewchan 也许您使用的是过时的 Python 版本。我相信从 Python 3 开始,默认情况下启用通用换行符,即即使在 Linux 上运行,\r\n
也会转换为文本文件。【参考方案3】:
def getText():
file=open("ex1.txt","r");
names=file.read().split("\n");
for x,word in enumerate(names):
if(len(word)>=20):
return 0;
print "length of ",word,"is over 20"
break;
if(x==20):
return 0;
break;
else:
return names;
def show(names):
for word in names:
len_set=len(set(word))
print word," ",len_set
for i in range(1):
names=getText();
if(names!=0):
show(names);
else:
break;
【讨论】:
【参考方案4】:import csv
with open(filename) as f:
csvreader = csv.reader(f)
for line in csvreader:
print(line[0])
【讨论】:
但是如果行中有逗号怎么办?【参考方案5】:temp = open(filename,'r').read().splitlines()
【讨论】:
您确定这会关闭文件吗?我认为它没有,所以它不是真正的单线......with
建议用于打开命令。例如:with open(file) as f: temp = f.read().splitlines()
【参考方案6】:
试试这个:
u=open("url.txt","r")
url=u.read().replace('\n','')
print(url)
【讨论】:
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性! 我不明白为什么有人应该使用它而不是一些替代解决方案。 只有在文件只包含一行时才有效。如果文件包含多行,则会删除每行结束的信息。【参考方案7】:my_file = open("first_file.txt", "r")
for line in my_file.readlines():
if line[-1:] == "\n":
print(line[:-1])
else:
print(line)
my_file.close()
【讨论】:
请添加一些解释,以便对其他人有用。 您应该使用上下文管理器来处理文件对象,并直接遍历文件。通过像这样使用.readlines()
,您可以有效地迭代整个文件两次。【参考方案8】:
一次读取一行文件。使用 str.rstrip(chars)
从字符串末尾删除不需要的字符。
with open(filename, 'r') as fileobj:
for row in fileobj:
print(row.rstrip('\n'))
另请参阅 str.strip([chars])
和 str.lstrip([chars])
。
【讨论】:
【参考方案9】:我认为这是最好的选择。
temp = [line.strip() for line in file.readlines()]
【讨论】:
此解决方案还删除了前导和尾随空格,这不是有意的。 不过,理解真的很好。至少在 Python 3 中,可以使用temp = [line.rstrip() for line in file.readlines()]
来获得 @Roland_Illig 注释的意图。
如果你要遍历所有的行,为什么不那么懒惰呢?使用.readlines()
,您实际上是在对整个文件进行两次迭代。
需要明确的是,readlines()
调用是多余的,所以这可能只是 temp = [line.strip() for line in file]
。【参考方案10】:
要删除尾随的行尾 (/n
) 字符和空列表值 (''
),请尝试:
f = open(path_sample, "r")
lines = [line for line in f.readlines() if line.strip() != '']
【讨论】:
以上是关于如何在没有换行符的情况下读取文件?的主要内容,如果未能解决你的问题,请参考以下文章