【问题标题】:Python - txt file into a listPython - 将txt文件放入列表
【发布时间】:2012-12-28 22:01:39
【问题描述】:

我正在尝试读取文件并将其中的文本保存为包含字符串的列表, (列表中的每个对象都是一个字符串,它是文本中的一行) 我只设法逐行打印出文本,而不是作为列表。

文本是一长串生物材料(如果你问我,随机字母 (:) 和-

    def read_proteome ( filename ):
       f= open(filename).readlines()
       for line in f:
          print(line)

只打印文件(确实分开了行..)

我哪里做错了? 如何将其设置为列表?

【问题讨论】:

  • 您为什么接受 Guillermo Bergengruen 的回答而不是 Martijn Pieters 的回答?
  • 哦,我只是以为我标记了所有答案.. 再次为大众感到抱歉,这里很新

标签: python list file-io python-3.x


【解决方案1】:

.readlines() is a list 的结果。只需打印f:

print(f)

【讨论】:

  • +1。要添加,变量不应命名为f。说,lstlines 会更好。在考虑解决方案时,一个好名字会有所帮助。一个不好的名字会导致混乱,因为你后来倾向于认为它被选得很好并且它意味着它所说的。
  • 扩展@pepr 所说的内容:f 这个名字让人认为它是一个文件对象,因为这是一个常见的(如果不是很好的话)文件变量名。事实上,OP 似乎把自己弄糊涂了,不小心检查了f=open('c:/hey.txt')type,而不是f=open('c:/hey.txt').readlines()——如果使用lines=open('c:/hey.txt'),这个错误会更加明显。
【解决方案2】:

Martijn Pieters 已经给出了一个简单而完整的答案,但值得学习如何自己解决这些问题。它通常更快,而且不会花费你六次投票。

首先,您可以使用for line in f: 的事实意味着f 显然是某种列表对象,因为它可以在for 循环中使用,就像list 一样。从技术上讲,这意味着它是“可迭代的”。

也许这意味着它已经是list?如果是这样,你已经完成了。如果没有,list 函数将接受任何可迭代并将其转换为 list,因此,您只需添加 f = list(f) 即可。

你怎么知道是哪个?

好吧,您可以将print(type(f)) 添加到您的代码中,看看它会打印什么。如果它显示list,你就完成了;如果它说什么,你需要添加转换线f = list(f)

以交互方式完成这一切通常比在脚本中更容易:

>>> f = open(filename).readlines()
>>> type(f)
list
>>> f
['first line\n', 'second line\n', 'last line\n']

如果你把它分解成碎片,你可以分别看到每个碎片的类型:

>>> filename = 'C:/foo.txt'
>>> type(filename)
str
>>> fileobj = open(filename)
>>> type(fileobj)
_io.TextIOWrapper
>>> lines = fileobj.readlines()
>>> type(lines)
list

当您将所有这些放在一行中时,lines=open('C:/foo.txt').readlines(),最终结果与您分三步完成的结果相同——lineslist

但是,如果您因为不知道该尝试什么而无法通过实验解决问题怎么办?

好吧,交互式解释器有内置帮助:

>>> fileobj = open(filename)
>>> help(fileobject.readlines)
Help on built-in function readlines:

readlines(...)
    Return a list of lines from the stream.

    hint can be specified to control the number of lines read: no more
    lines will be read if the total size (in bytes/characters) of all
    lines so far exceeds hint.

它在那里说它返回一个list

或者,您可以查看the documentation。尝试猜测 readlines 在 3.x 中的位置实际上有点复杂,因为 open 返回的事物类型并不明显……但您可以使用左侧的“快速搜索”,您将找到io.ioBase.readlines,给你同样的答案:

readlines(hint=-1)

从流中读取并返回行列表。可以指定提示来控制读取的行数:如果到目前为止所有行的总大小(以字节/字符为单位)超过提示,则不会再读取行。

【讨论】:

  • tahnks !我还是不明白,我尝试了你的建议,python简单地崩溃了,可能是因为文件很长?
  • @dulce.de.leche:我不知道“压倒”是什么意思。你到底做了什么,到底发生了什么?理想情况下,从会话中复制和粘贴,就像我在上面所做的那样,而不是试图解释它。
  • 对不起,我做了一个新的 txt 文件再试一次,起初它确实认出了 f a a list,但现在:f=open('c:/hey.txt') f。 readlines() 确实返回 - ['hey how-are-you /n i-am-okthankyou'] 但 type(f) 是 instaed of list...
  • @dulce.de.leche: 好的,open('c:/hey.txt') 是一个文件对象(在现代 Python 中称为<class _io.TextIOWrapper>。但open('c:/hey.txt').readlines() 是调用readlines 的结果一个文件对象,它是字符串的list。我将编辑答案以使其更清楚。
  • 再次感谢 :) 希望取得进展(不仅是我的程序,还有学习如何正确评论)
【解决方案3】:

正如 Martijn 所说,.readlines() 将文件转换为列表并在它们之间循环。但是,这就是我认为您正在尝试做的事情。

with open("file.txt", 'r') as file:
    print file.read().split("\n")

【讨论】:

    【解决方案4】:

    正如 Martijn 所说,readlines() 方法返回一个列表,如 python documentation 中所述。

    如果您需要将字符串转换为列表,请使用:ast helper

    导入 ast stringList = "{'a':'text'}" realList = ast.literal_eval(stringList) 打印真实列表

    希望这是你需要的!

    【讨论】:

    • 请注意,OP 使用的是 Python 3,但您的代码和文档链接假定为 Python 2。
    • 此外,您的示例是针对字典,而不是列表,因此您只是在这里使事情变得更复杂。
    • @GuillermoBergengruen:嗯,是的,除了在您的示例中,realList 不会是list,这意味着您自己的描述具有误导性,这也意味着它没有回答OP的问题。此外,即使经过编辑,这仍然不是合法的 Python 3。
    • 简单的事情应该以简单的方式完成。 ast 真的应该只在你真正需要的时候使用。
    猜你喜欢
    • 2015-12-13
    • 2018-01-05
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多