【问题标题】:How to split line in readlines and save them in different list?如何在 readlines 中拆分行并将它们保存在不同的列表中?
【发布时间】:2020-02-29 07:54:35
【问题描述】:

这是我的代码

with open('file.txt', 'r') as source:
    # Indentation
    polTerm = [line.strip().split()[0] for line in source.readlines()]
    polFreq = [int(line.strip().split()[1]) for line in source.readlines()]

这是在 file.txt 中

anak 1
aset 3
atas 1
bangun 1
bank 9
benar 1
bentuk 1

我得到了我想要的 polTerm:

['anak', 'aset', 'atas', 'bangun', 'bank', 'benar', 'bentuk']

但是对于 polFreq,而不是这个:

['1', '3', '1', '1', '9', '1', '1']

我得到的是这样的空白列表:

[ ]

有人知道为什么会这样吗?以及如何解决这个问题,这样我就可以得到我想要的。

【问题讨论】:

  • 这能回答你的问题吗? Using "readlines()" twice in a row
  • 感谢您的回答!另一个问题,除此之外还有更好的方法吗?
  • 谢谢!,我只是在polTerm = [line.strip().split()[0] for line in source.readlines()] 之前添加lines = source.readlines() 并将所有source.readlines 更改为lines
  • 您有 4 个答案,似乎可以解决您的问题。对于这些答案的一些细节,您仍然需要帮助或建议吗?

标签: python split nlp tokenize readlines


【解决方案1】:
with open('file.txt','r') as source:
     data=source.readlines()
a1=[] 
a2=[] 
for line in data:
     x=line.split()
     a1.append(x[0])
     a2.append(x[1])

【讨论】:

  • 您可以在 data= 行之后立即取消缩进。这会提前关闭文件并降低缩进级别(在我看来通常是个好主意)
  • 确实如此,感谢您的建议,这对效率非常有用。
【解决方案2】:

@Carcgenicate 给你字面上的答案。

但是,在我看来,您不应该两次读取文件(除非文件非常大,并且它的所有行都不适合内存。

如果文件不是那么大,则无需两次读取文件。 如果它有点大,那么只需将前两列读入内存即可。 然后将它们分开。

我的建议是:

with open('file.txt', 'r') as source:
    cols_1_and_2 = [line.strip().split(None, 2)[:2] for line in source.readlines()]

polTerm = [cols[0] for cols in cols_1_and_2]
polFreq = [int(cols[1]) for cols in cols_1_and_2]
del cols_1_and_2  # this line is to free some memory if that would be an issue

【讨论】:

    【解决方案3】:

    正如 Carcigenicate 所说,.readlines 是一个返回列表的生成器。如果您不将该列表保存在变量中,则第二次调用生成器将不会返回任何内容,因为生成器已在您的第一次调用中耗尽。你想要的是这样的:

    with open("file.txt","r") as inf:
        # Now your lines list is saved in a global variable 
        # which can be used outside with open().
        # The .readlines generator is exhausted and won't return 
        # anything.
        raw = inf.readlines()
    
    polTerm = [line.strip().split()[0] for line in raw]
    polFreq = [int(line.strip().split()[1]) for line in raw]
    

    专业提示:学习使用 pandas,特别是 pd.read_csv()。

    【讨论】:

      【解决方案4】:
      with open('file.txt', 'r') as source:
          lines = source.readlines()
          polTerm = [line.strip().split()[0] for line in lines]
          polFreq = [int(line.strip().split()[1]) for line in lines]
      

      原因是readlines() 是一个迭代器,所以第一次调用已经消耗了它,它变成了空的,当你第二次尝试使用那个空的迭代器时你发现它是空的。

      【讨论】:

      • 您可以取消缩进最后两行。它们不必出现在with 语句中。这会提前关闭文件
      • @gelonida 我知道。但这是另一个问题,一个效率问题。如果您同时回答两个问题,可能会增加提问者的复杂性。我只是几乎没有修改他的代码,这样他就可以跟随并找出他在哪里弄错了。
      • 是的。我只是认为它更容易阅读并且更清楚地表明文件访问已完成(文件只读取一次)。但当然在这种情况下它并不重要。
      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 2020-10-11
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多