使用.readlines()时摆脱\n

TDN*_*DNS 209 python readline python-2.7

我有一个包含值的.txt文件.

值如下所示:

Value1
Value2
Value3
Value4
Run Code Online (Sandbox Code Playgroud)

我的目标是将值放在列表中.当我这样做时,列表看起来像这样:

['Value1\n', 'Value2\n', ...]

\n是没有必要的.

这是我的代码:

t = open('filename.txt', 'r+w')
contents = t.readline()

alist = []

for i in contents:
    alist.append(i)
Run Code Online (Sandbox Code Playgroud)

小智 271

这应该做你想要的(列表中的文件内容,按行,没有\n)

with open(filename) as f:
    mylist = f.read().splitlines() 
Run Code Online (Sandbox Code Playgroud)

  • 这[内存效率不高](http://axialcorps.com/2013/09/27/dont-slurp-how-to-read-files-in-python/).因此,"[文件对象]中的换行"回答. (29认同)
  • 来自@bfrederix的网址被破坏了.这里有一个archive.org副本https://web.archive.org/web/20160215030807/http://axialcorps.com/2013/09/27/dont-slurp-how-to-read-files-in-python/ (5认同)
  • mylist = [如果我在ilist中为i,如果我!=“] (2认同)
  • *小文件*的最佳解决方案。 (2认同)

hug*_*own 113

我这样做:

alist = [line.rstrip() for line in open('filename.txt')]
Run Code Online (Sandbox Code Playgroud)

要么:

with open('filename.txt') as f:
    alist = [line.rstrip() for line in f]
Run Code Online (Sandbox Code Playgroud)

  • 这可以剥离不仅仅是`\n`. (13认同)
  • 根据我的经验,追踪空白(空格,制表符,CR,LF等)永远不可取.二十多年来,我没有处理过数据或计算机语言,想要尾随空格.所以,是的,它剥离超过\n.机会是,你不会错过它. (9认同)
  • @hughdbrown 阿门,只是想将其标记为 gronostaj 评论的潜在示例,因为这是用 readlines 剥离 \n 的第一个 Google 结果。不过你的观点已经被理解了! (5认同)
  • 可能会受到伤害的一种情况是右击制表符分隔的值文件,其中某些行在其最右边的单元格中具有多个空值。如果要在\ t上拆分,则这些行的长度将比其他行短。 (3认同)
  • @duhaime 你有点在切换上下文。如果有人问,“我如何读取带有制表符分隔字段的 CR 分隔行文件?” 我肯定会推荐使用 python 的 CSV 模块。我不会给出适用于带有 CR 分隔数据行的纯文本文件的提示。所以制表符分隔值是一种不好的情况,如果这样说,这个答案永远不会是我的建议。 (2认同)

Mar*_*ers 91

您可以使用.rstrip('\n')只能从字符串的结尾去掉换行符:

for i in contents:
    alist.append(i.rstrip('\n'))
Run Code Online (Sandbox Code Playgroud)

这使得所有其他空白完好无损.如果你不关心线的起点和终点处的空格,那就叫大重锤.strip().

但是,因为你是从文件中读取,并拉一切到内存无论如何,最好使用str.splitlines()方法 ; 这会在行分隔符上拆分一个字符串,并返回没有这些分隔符的行列表; 在file.read()结果上使用它,根本不使用file.readlines():

alist = t.read().splitlines()
Run Code Online (Sandbox Code Playgroud)

  • `file.read().splitlines()` 完美地完成了这项工作,但我需要每次都访问此页面只是为了提醒自己如何做到这一点。天啊,我希望他们能以一种直观的方式包含它,比如“file.readlines(newlines=False)” (11认同)
  • @pcko1:我不认为这更直观。无论如何,我总是将文件对象用作可迭代对象(因此,将使用“list(file)”而不是“file.readlines()”),因此知道需要换行。大多数情况下,尝试通过迭代来处理文件中的行*作为流*。`for line in file: dosomething(line)` 或 `[dosomething(line) for line in file]`,而不是将所有行读入内存。 (2认同)

ask*_*han 11

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

for i in contents:
    alist.append(i.strip())
Run Code Online (Sandbox Code Playgroud)

但是根据您的使用情况,您可能最好使用类似的东西,numpy.loadtxt或者即使numpy.genfromtxt您需要从文件中读取的数据库.


Lis*_*sle 11

打开文件后,列表推导可以在一行中完成:

fh=open('filename')
newlist = [line.rstrip() for line in fh.readlines()]
fh.close()
Run Code Online (Sandbox Code Playgroud)

请记住之后关闭您的文件.

  • _只需记住事后关闭文件。_或者不要冒险,使用上下文管理器。 (9认同)

eyq*_*uem 9

from string import rstrip

with open('bvc.txt') as f:
    alist = map(rstrip, f)
Run Code Online (Sandbox Code Playgroud)

诺塔Bene的:rstrip()去掉空格,即:\f, \n,\r,\t,\v,\x和空白 ,
but I suppose you're only interested to keep the significant characters in the lines. Then, mere map(strip, f)更适合,删除标题空白.


如果您真的想要仅消除NL \n和RF \r符号,请执行以下操作:

with open('bvc.txt') as f:
    alist = f.read().splitlines()
Run Code Online (Sandbox Code Playgroud)

没有参数传递的splitlines()不保留NL和RF符号(Windows在行的末尾记录NLRF的文件,至少在我的机器上),但保留其他空格,特别是空格和制表符.

.

with open('bvc.txt') as f:
    alist = f.read().splitlines(True)
Run Code Online (Sandbox Code Playgroud)

具有相同的效果

with open('bvc.txt') as f:
    alist = f.readlines()
Run Code Online (Sandbox Code Playgroud)

也就是说保留了NL和RF


geo*_*230 6

我遇到了同样的问题,我发现以下解决方案非常有效。我希望它能帮助你或其他想做同样事情的人。

首先,我会从“with”语句开始,因为它确保正确打开/关闭文件。

它应该是这样的:

with open("filename.txt", "r+") as f:
    contents = [x.strip() for x in f.readlines()]
Run Code Online (Sandbox Code Playgroud)

如果要将这些字符串(内容列表中的每个项目都是字符串)转换为整数或浮点数,您可以执行以下操作:

contents = [float(contents[i]) for i in range(len(contents))]
Run Code Online (Sandbox Code Playgroud)

如果要转换为整数,请使用int代替float

这是我在 SO 中的第一个答案,如果格式不正确,请见谅。

  • `f.read().splitlines()` 会更有效率,我猜。对于 int 或 float 转换,`map(int, f.read().splitlines())` 可能更好。 (3认同)

Yog*_*thy 6

我使用了剥离功能来消除换行符,因为分割行在4 GB的文件上引发了内存错误。

样例代码:

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

  • 通过像这样使用 .readlines() ,您可以有效地迭代整个文件两次,同时将整个文件一次性保存在内存中。 (2认同)