【问题标题】:Concatenating a list of files into a list of strings in Python将文件列表连接成 Python 中的字符串列表
【发布时间】:2013-04-21 00:23:09
【问题描述】:

我正在尝试创建一个类对象,其构造函数接收文件列表,将每个文件转换为字符串列表(每行一个)并将所有列表连接在一起并存储它。该类还包含一个成员函数,它从列表中输出随机行

class randline:
    def __init__(self, filename = [] ):
        #def __init__(self, filename = [] , *args):

        #for i in range(len(filename)):
        self.lines = []

        for path in filename:
           with open(path, 'r') as f:
                self.lines + f.readlines()
                f.close()

    def chooseline(self):
      if self.lines:
        return random.choice(self.lines)

def main():
#...
    try:
        generator = randline(args)
        for index in range(numlines):
            sys.stdout.write(generator.chooseline())
    except IOError as (errno, strerror):
        parser.error("I/O error({0}): {1}".
                     format(errno, strerror))

这会产生错误消息:

Traceback (most recent call last):
  File "./1randline.py", line 59, in <module>
    main()
  File "./1randline.py", line 53, in main
    sys.stdout.write(generator.chooseline())
TypeError: expected a character buffer object

但是chooseline() 会从连接的文件字符串列表中生成一个字符串,不是吗?所以我很难找出问题所在。

【问题讨论】:

  • self.lines + f.readlines() 什么都不做。也许你想改用self.lines += f.readlines()
  • 关于def __init__(self, filename = []):——这个习惯会给你带来麻烦。不要使用列表等可变对象作为默认参数——请参阅here 了解原因。
  • @DSM 谢谢,我应该改用什么? *文件名?

标签: python file concatenation


【解决方案1】:

应该是

self.lines += f.readlines() # notice the += 
# self.lines.extend(f.readlines()) is equivalent

但是你可以使用 fileinput 来代替

import fileinput
lines = list(fileinput.input(paths))

【讨论】:

    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2023-03-25
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多