使用 .readlines() 时摆脱 \n [重复]

Posted

技术标签:

【中文标题】使用 .readlines() 时摆脱 \\n [重复]【英文标题】:Getting rid of \n when using .readlines() [duplicate]使用 .readlines() 时摆脱 \n [重复] 【发布时间】:2022-01-04 08:39:38 【问题描述】:

我有一个包含值的 .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)

【问题讨论】:

通常你想先读入所有行,存储在缓冲区中,然后删除换行符/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 函数来删除换行符,因为拆分行会在 4 gb 文件上引发内存错误。

示例代码:

with open('C:\\aapl.csv','r') as apple:
    for apps in apple.readlines():
        print(apps.strip())

【讨论】:

通过像这样使用.readlines(),您可以有效地对整个文件进行两次迭代,同时将整个文件一次保存在内存中。【参考方案6】:

对于列表中的每个字符串,使用.strip() 删除字符串开头或结尾的空格:

for i in contents:
    alist.append(i.strip())

但根据您的用例,如果您需要从文件中读取的一组漂亮的数据,您最好使用numpy.loadtxt 甚至numpy.genfromtxt 之类的东西。

【讨论】:

【参考方案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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Ruby-on-Rails:如何摆脱“你被重定向”页面

使用 readlines 导入后从 Python 列表中删除 \r\n

在 React 中使用链接组件时如何摆脱样式

R语言readLines函数n.readLines函数readline函数读取文本文件实战

从readlines删除行()

apache中的vhost重写规则-摆脱子域而不重定向