ChatGPT解决这个技术问题 Extra ChatGPT

如何在没有换行符的情况下读取文件?

在 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 尾随换行符,我会很好。

B
Boris Verkhovskiy

您可以使用 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 的精确副本。


请注意,[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 open(...) as f: lines = (line for line in f) 并在 with 之外使用 lines,因为您会收到 I/O 错误。您可以使用 genexp 偷懒,但您必须在关闭文件之前使用它。
@WesTurner。但不会有超过一个尾随换行符。额外的换行符将成为下一个空行的一部分
A
Augustin
temp = open(filename,'r').read().splitlines()

但是 \r\n 换行符会发生什么? ;)
Python 自动处理通用换行符,因此 .split('\n') 将正确拆分,独立于换行符约定。如果您以二进制模式读取文件会很重要。在这种情况下,splitlines() 处理通用换行符,而 split('\n') 不处理。
而且总是有 os.linesep :)
@LarsH,在某些情况下会有所帮助,在我的系统上,\r\n 行结尾 not 转换为 \n,无论是作为文本还是二进制读取,所以 os.linesep 可以在 \n 的地方工作才不是。但是 splitlines 显然是更好的选择,以防您提到文件与 os.os 不匹配的位置。真的,我主要提到它,以防查看此讨论的人不知道它的存在。
open() defaults to read mode。您不必通过 'r'
m
mkrieger1

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

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

另请参阅 str.strip([chars])str.lstrip([chars])


读取模式为 the default mode。您不必显式传递 'r'
c
cieunteung

我认为这是最好的选择。

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]
M
Marcel
temp = open(filename,'r').read().splitlines()

你确定这会关闭文件吗?我认为它没有,所以它不是真正的单线......
建议将 with 用于打开命令。例如:with open(file) as f: temp = f.read().splitlines()
S
SherylHohman

尝试这个:

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

虽然此代码段可能会解决问题,但 including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来拥挤你的代码,因为这会降低代码和解释的可读性!
我不明白为什么有人应该在某些替代解决方案上使用它。
这仅适用于文件仅包含一行的情况。如果文件包含多行,它会删除每行结束的信息。
Y
YScharf

要删除尾随的行尾 (/n) 字符和空列表值 (''),请尝试:

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

更新为从每一行中删除 newline
m
marbel

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

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

D
David Gilbertson

我最喜欢的单行 - 如果你不计算 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


A
Abdelrahman Saleh

此处的此脚本将从文件中获取行并将每一行不带换行符的行保存在 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()

如果您查看 line,则此值为 data\n,因此我们将 splitlines()

使其成为一个数组并 [0] 选择唯一的单词数据


N
Necriss
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(),您可以有效地对整个文件进行两次迭代。
s
srus
import csv

with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])

但是,如果该行中有逗号怎么办?