【问题标题】:Python File iterator running multiple timesPython文件迭代器多次运行
【发布时间】:2017-02-23 06:36:51
【问题描述】:

我正在使用 gensim 创建我在目录中的示例文件的 word2vec 模型。我遵循了一个在线教程,它读取目录中的文件并逐行处理。我的示例文件中有 9 行。但是这段代码给了我同样的行 9 次。有人可以解释一下发生了什么。

 class MySentences(object):
     def __init__(self, dirname):
         self.dirname = dirname   

     def __iter__(self): 
         for fname in os.listdir(self.dirname):
             for line in open(os.path.join(self.dirname, fname)):
                 print os.path.join(self.dirname, fname)
                 yield line.split() 

 sentences = MySentences('/fakepath/Folder')

详情: 假设文件名包含 3 行,如

hi how are you.
I am fine.
I am good.

line.split() 应该只给我一次:['hi','how','are','you']。但这发生了 3 次,所以我三次而不是一次获得上述列表。如果总句数为 5,则返回该行 5 次。

【问题讨论】:

  • line.split() 中的line 是什么?它是如何初始化的?
  • 对于文件中的每一行。它在 for 循环中声明
  • 那么,'fakepath/filename.txt'dirname?对我来说,它看起来像一个文件名,而不是目录名。
  • 是的,对不起,这是目录名。我已经编辑过了
  • 我实际上尝试了您的代码(Python 2.7.3。),它按预期工作。

标签: python python-2.7 iterator word2vec listiterator


【解决方案1】:

首先你应该弄清楚你想要做什么。 class MySentences 将目录作为参数并创建一个对象sentences,其中包含一个生成器。所以sentences 有一个生成器,包含目录中所有文件中的所有行。

例如:

for line in sentences:
    print(line)

你会得到很多以单词为元素的列表(我已经删除了打印路径的打印语句)。即:

['hi', 'how', 'are', 'you.']

['I', 'am', 'fine.']

['I', 'am', 'good.']

【讨论】:

  • 是的,但它会打印上述 3 个列表 6 次。所以 ['hi', 'how', 'are', 'you.'] ['I', 'am', 'fine.'] ['I', 'am', 'good.'] 打印六个次。
  • 你能在没有print(os.path.join(self.dirname, fname))的情况下试试吗,代码在我的电脑上运行良好。
  • 你的打印代码是?你能给我们看看代码吗?
  • 当然,您能在 yield line.split() 上方的 iter 中添加一个“打印行”语句并告诉打印的内容吗?它是只打印文件中的行一次还是多次?感谢您的帮助,谢谢!
  • 如果在yield line.split() 上方添加打印语句,它将打印path 加上filename 的次数与sentences 中的列表数量一样多。
猜你喜欢
  • 2015-08-20
  • 2020-01-03
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2021-10-05
相关资源
最近更新 更多