在 Python 中,调用
temp = open(filename,'r').readlines()
生成一个列表,其中每个元素都是文件中的一行。这有点愚蠢但仍然:readlines()
还向每个元素写入换行符,这是我不希望发生的事情。
我怎样才能避免它?
[l.strip('\n\r') for l in temp]
。甚至rstrip
。由于这里的迭代可以是 in open
而不是 in temp
。
newline
参数设置为 chomped 尾随换行符,我会很好。
您可以使用 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()
\r\n
换行符会发生什么? ;)
.split('\n')
将正确拆分,独立于换行符约定。如果您以二进制模式读取文件会很重要。在这种情况下,splitlines()
处理通用换行符,而 split('\n')
不处理。
os.linesep
:)
\r\n
行结尾 not 转换为 \n
,无论是作为文本还是二进制读取,所以 os.linesep
可以在 \n
的地方工作才不是。但是 splitlines
显然是更好的选择,以防您提到文件与 os.os 不匹配的位置。真的,我主要提到它,以防查看此讨论的人不知道它的存在。
一次读取一行文件。使用 str.rstrip(chars)
从字符串末尾删除不需要的字符。
with open(filename, 'r') as fileobj:
for row in fileobj:
print(row.rstrip('\n'))
另请参阅 str.strip([chars])
和 str.lstrip([chars])
。
'r'
。
我认为这是最好的选择。
temp = [line.strip() for line in file.readlines()]
temp = [line.rstrip() for line in file.readlines()]
来获得@Roland_Illig 注释的意图。
.readlines()
,您可以有效地对整个文件进行两次迭代。
readlines()
调用是多余的,所以这可能只是 temp = [line.strip() for line in file]
。
temp = open(filename,'r').read().splitlines()
with
用于打开命令。例如:with open(file) as f: temp = f.read().splitlines()
尝试这个:
u=open("url.txt","r")
url=u.read().replace('\n','')
print(url)
要删除尾随的行尾 (/n
) 字符和空列表值 (''
),请尝试:
f = open(path_sample, "r")
lines = [line.rstrip('\n') for line in f.readlines() if line.strip() != '']
newline
。
您可以使用列表推导轻松地将文件作为列表读取
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
此处的此脚本将从文件中获取行并将每一行不带换行符的行保存在 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] 选择唯一的单词数据
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()
,您可以有效地对整个文件进行两次迭代。
import csv
with open(filename) as f:
csvreader = csv.reader(f)
for line in csvreader:
print(line[0])
[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):
with
会在块终止时关闭文件,这意味着您不能执行with open(...) as f: lines = (line for line in f)
并在with
之外使用lines
,因为您会收到 I/O 错误。您可以使用 genexp 偷懒,但您必须在关闭文件之前使用它。