使用 .readlines() 时摆脱 \n [重复]
Posted
技术标签:
【中文标题】使用 .readlines() 时摆脱 \\n [重复]【英文标题】:Getting rid of \n when using .readlines() [duplicate]使用 .readlines() 时摆脱 \n [重复] 【发布时间】:2013-02-20 10:00:42 【问题描述】:我有一个包含值的 .txt 文件。
这些值是这样列出的:
Value1
Value2
Value3
Value4
我的目标是将值放在一个列表中。当我这样做时,列表如下所示:
['Value1\n', 'Value2\n', ...]
\n
不需要。
这是我的代码:
t = open('filename.txt', 'r+w')
contents = t.readline()
alist = []
for i in contents:
alist.append(i)
【问题讨论】:
使用 Matrix[i][j] = map(int,sys.stdin.readline().split()) 通常你不想先读入所有行,存储在缓冲区中,然后删除换行符/splitlines()
- 如果文件是大。你想rstrip()
每一行的换行符,当你阅读和迭代时。
【参考方案1】:
这应该做你想要的(列表中的文件内容,按行,不带 \n)
with open(filename) as f:
mylist = f.read().splitlines()
【讨论】:
mylist = [i for i in mylist if i != ''] @bfrederix 建议的 url 已损坏。这里是archive.org 的副本web.archive.org/web/20160215030807/http://axialcorps.com/2013/… @Chiramisu 该链接似乎指向了不相关/无意的地方。 @AMC 你说得对,我已经删除了我的,因为 Paolo Melchiorre 已经发布了一个更好的存档版本链接。 小文件的最佳解决方案。【参考方案2】:我会这样做:
alist = [line.rstrip() for line in open('filename.txt')]
或:
with open('filename.txt') as f:
alist = [line.rstrip() for line in f]
【讨论】:
这不仅可以剥离\n
。
根据我的经验,尾随空格(空格、制表符、CR、LF 等)是不可取的。二十多年来,我处理过的任何数据或计算机语言都没有需要尾随空格。所以,是的,它剥离的不仅仅是\n。很有可能,你不会错过的。
这可能会造成伤害的一种情况是右剥离制表符分隔的值文件,其中某些行在其最右侧的单元格中有多个空值。如果要在 \t ... 上拆分,这些行的长度将比其他行短...
@duhaime 你有点切换上下文。如果有人问,“我怎样才能读入由 CR 分隔的行和制表符分隔的字段的文件?”我肯定会推荐使用 python 的 CSV 模块。我不会给出适用于具有 CR 分隔的数据行的纯文本文件的提示。所以制表符分隔的值是一种不好的情况,如果这样说,这个答案永远不会是我的建议。
@hughdbrown amen,只是想将此标记为 gronostaj 评论的潜在示例,因为这是使用 readlines 剥离 \n 的第一个 Google 结果。不过你的意思是明白的!【参考方案3】:
您可以使用.rstrip('\n')
仅从字符串末尾删除换行符:
for i in contents:
alist.append(i.rstrip('\n'))
这会使所有其他空白保持不变。如果您不关心行首和行尾的空格,那么大重锤称为.strip()
。
但是,由于您正在读取文件并将所有内容都拉入内存无论如何,最好使用str.splitlines()
method;这会在行分隔符上拆分一个字符串并返回没有这些分隔符的行列表;在file.read()
结果上使用它,并且根本不要使用file.readlines()
:
alist = t.read().splitlines()
【讨论】:
file.read().splitlines()
完美地完成了这项工作,但我每次都需要访问此页面只是为了提醒自己如何做到这一点。上帝,我希望他们以直观的方式将其包含在内,例如 file.readlines(newlines=False)
@pcko1:我不觉得这更直观。无论如何,我总是将文件对象用作可迭代对象(因此,将使用list(file)
而不是file.readlines()
),因此知道期待换行符。大多数情况下,尝试通过迭代来处理文件中的行作为流。 for line in file: dosomething(line)
或 [dosomething(line) for line in file]
,而不是将所有行读入内存。【参考方案4】:
打开文件后,列表推导可以一行完成:
fh=open('filename')
newlist = [line.rstrip() for line in fh.readlines()]
fh.close()
请记住之后关闭您的文件。
【讨论】:
记得在之后关闭你的文件。或者不要冒险,使用上下文管理器。【参考方案5】:对于列表中的每个字符串,使用.strip()
删除字符串开头或结尾的空格:
for i in contents:
alist.append(i.strip())
但根据您的用例,如果您需要从文件中读取的一组漂亮的数据,您最好使用numpy.loadtxt
甚至numpy.genfromtxt
之类的东西。
【讨论】:
【参考方案6】:我使用 strip 函数来删除换行符,因为拆分行会在 4 gb 文件上引发内存错误。
示例代码:
with open('C:\\aapl.csv','r') as apple:
for apps in apple.readlines():
print(apps.strip())
【讨论】:
通过像这样使用.readlines()
,您可以有效地对整个文件进行两次迭代,同时将整个文件一次保存在内存中。【参考方案7】:
from string import rstrip
with open('bvc.txt') as f:
alist = map(rstrip, f)
Nota Bene:rstrip()
删除空格,也就是说:\f
,\n
,\r
,\t
,\v
,\x
和空白 ,
但我想您只对保留行中的重要字符感兴趣。然后,仅使用
map(strip, f)
会更合适,同时删除标题空格。
如果您真的只想消除 NL \n
和 RF \r
符号,请执行以下操作:
with open('bvc.txt') as f:
alist = f.read().splitlines()
没有传递参数的splitlines() 不会保留NL 和RF 符号(Windows 在行尾记录带有NLRF 的文件,至少在我的机器上是这样),但会保留其他空格,尤其是空格和制表符。
.
with open('bvc.txt') as f:
alist = f.read().splitlines(True)
效果和
一样with open('bvc.txt') as f:
alist = f.readlines()
也就是说保留了NL和RF
【讨论】:
【参考方案8】:我遇到了同样的问题,我发现以下解决方案非常有效。我希望它能帮助你或其他所有想做同样事情的人。
首先,我会从“with”语句开始,因为它可以确保正确打开/关闭文件。
它应该看起来像这样:
with open("filename.txt", "r+") as f:
contents = [x.strip() for x in f.readlines()]
如果您想将这些字符串(内容列表中的每个项目都是一个字符串)转换为整数或浮点数,您可以执行以下操作:
contents = [float(contents[i]) for i in range(len(contents))]
如果要转换为整数,请使用 int
而不是 float
。
这是我在 SO 中的第一个答案,如果格式不正确,请见谅。
【讨论】:
我猜f.read().splitlines()
会更有效率。而对于 int 或 float 转换,map(int, f.read().splitlines())
可能会更好。
通过像这样使用 .readlines() ,您可以有效地迭代整个文件两次,同时将整个文件一次保存在内存中。【参考方案9】:
我最近用它来读取文件中的所有行:
alist = open('maze.txt').read().split()
或者您可以使用它来增加一点额外的安全性:
with f as open('maze.txt'):
alist = f.read().split()
它不适用于单行文本之间的空格,但看起来您的示例文件可能没有空格分隔值。这是一个简单的解决方案,它返回一个准确的值列表,并且不会为每个空行添加一个空字符串:''
,例如文件末尾的换行符。
【讨论】:
使用这个解决方案有什么好处吗?你避免输入整整 5 个字符?【参考方案10】:with open('D:\\file.txt', 'r') as f1:
lines = f1.readlines()
lines = [s[:-1] for s in lines]
【讨论】:
通过像这样使用 .readlines() ,您可以有效地迭代整个文件两次,同时将整个文件一次保存在内存中。不仅如此,使用s[:-1]
可以删除文件的最后一个非换行符。我认为使用它比任何其他解决方案都没有好处。【参考方案11】:
最简单的方法是写file.readline()[0:-1]
这将读取除最后一个字符(即换行符)以外的所有内容。
【讨论】:
最后一个字符并不总是换行符。可以创建一个不以换行符结尾的文本文件(尽管大多数编辑器都包含一个)。 这是换行符。 换行符?这个问题很明显是关于一个多行的文件,我们想从每一行中删除换行符。以上是关于使用 .readlines() 时摆脱 \n [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 readlines 导入后从 Python 列表中删除 \r\n