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

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


当前回答

你可以使用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]

或者一个更简单的选择是去掉换行符:

[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.r edlines())在f2中生成f的精确副本。

其他回答

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

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

请参见str.strip([chars])和str.lstrip([chars])。

试试这个:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  

我最喜欢的一行程序——如果你不从pathlib import Path:)

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

这将自动关闭文件,不需要使用open()…

在Python 3.5中添加。

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

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

with open("foo.txt", 'r') as f:
    lst = [row.rstrip('\n') for row in f]
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()