如何读取没有换行符的文件?

在Python中,调用例如temp = open(filename,'r').readlines()会生成一个列表,其中每个元素都是文件中的一行。然而,这些字符串在末尾有一个换行符,这是我不想要的。

我怎么能得到没有换行符的数据?

697224 次浏览

你可以使用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())f2中生成了f的精确副本。

temp = open(filename,'r').read().splitlines()
import csv


with open(filename) as f:
csvreader = csv.reader(f)
for line in csvreader:
print(line[0])
temp = open(filename,'r').read().splitlines()

试试这个:

u=open("url.txt","r")
url=u.read().replace('\n','')
print(url)
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()

每次读取文件一行。使用str.rstrip(chars)从字符串末尾删除不需要的字符。

with open(filename, 'r') as fileobj:
for row in fileobj:
print(row.rstrip('\n'))

参见str.strip([chars])str.lstrip([chars])

我认为这是最好的选择。

temp = [line.strip() for line in file.readlines()]

要摆脱尾随的行结束符(/n)字符和空列表值(''),尝试:

f = open(path_sample, "r")
lines = [line.rstrip('\n') for line in f.readlines() if line.strip() != '']

这个脚本将从文件中取行,并保存每一行不带换行符的行,在file2中以<强> 0 < / >强结尾。

file = open("temp.txt", "+r")
file2 = open("res.txt", "+w")
for line in file:
file2.writelines(f"{line.splitlines()[0]},0\n")
file2.close()

如果你看< >强线< / >强,这个值是< >强劲数据\ n < / >强,所以我们放splitlines()

将其作为数组<强>[0]< / >强,并选择唯一的单词< >强劲数据< / >强

您可以使用列表推导式轻松地将文件读取为列表

with open("foo.txt", 'r') as f:
lst = [row.rstrip('\n') for row in f]

我最喜欢的一句话——如果你不计算from pathlib import Path:)

lines = Path(filename).read_text().splitlines()

这将自动关闭文件,不需要with open()...

在Python 3.5中添加。

https://docs.python.org/3/library/pathlib.html#pathlib.Path.read_text