将文件中的列表附加到Python中的单个列表中

时间:2009-11-30 15:05:26

标签: python list io

我正在尝试编写一个从“延迟”目录中读取文件的函数,该目录包含包含列表的文件。以下是延迟文件夹中的文件包含的内容:

'173378981', '45000', '343434', '3453453', '34534545', '3452342', '234234', '42063008', 'Exempted', '10000'
'1000014833', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'1000009598', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'279483421', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'1000009600', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'389453080', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'1000009602', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'

用于写入文件的函数:

def storeDeferredRecords(records):
    """docstring for createFile"""
    now = datetime.datetime.now()
    filename = deferredDir + '/' + now.strftime("%Y%m%d-%H%M%S")
    f = open(filename, 'w')
    newlist = map(lambda(x): str(x)[1:-1], records)
    for item in newlist:
        f.write("%s\n" % item)
    f.close

我需要有关用于读取文件的函数的帮助。我只能写这个:

def getDeferredRecords():
        """docstring for getDeferredRecords"""
        infiles = [infile for infile in glob.glob(deferredDir + '/*')]
                <code to read the contents of each file here>

有人可以帮帮我吗?我需要阅读这些行并将它们插入列表中。然后,该列表将与来自单独CSV文件的记录合并。

4 个答案:

答案 0 :(得分:2)

首先,商店功能的最后一行必须像f.close()

您的商店功能以换行符分隔的方式保存值。要阅读所有文件,应该足够了:

def getDeferredRecords():
    """docstring for getDeferredRecords"""
    return dict((infile, list(iter(file(infile)))) 
                     for infile in glob.glob(deferredDir + '/*'))

说明:文件是可迭代的,因此您可以执行for line in file: print line。使用list(iter(file)),您可以在列表中包含文件行。 dict((a, b) for a, b in foo)会返回包含{a: b}对的字典。函数的返回值是格式为{filename: list_of_lines_in_file}的字典。请记住,列表元素是带有尾随换行符的字符串。

答案 1 :(得分:1)

请参阅the csv module

BigList = []
for filename in glob.glob(deferredDir + '/*'):
    PartList = csv.reader(open(filename))
    BigList.extend(PartList)

这是你的想法吗?

答案 2 :(得分:1)

Python cvs模块可能是一个很好的答案:
http://docs.python.org/library/csv.html

<强>问题:

glob.glob()已经返回一个可迭代的,所以我在这里看不到这一点...

[infile for infile in glob.glob(deferredDir + '/*')]

相反:

BigList = []
for filename in glob.glob(deferredDir + '/*'):
    #CVS read code here
    #add to BigList

深思熟虑。

答案 3 :(得分:0)

结合Tim Pietzcker的想法,以下是重写函数:

def storeDeferredRecords(records):
    """docstring for createFile"""
    now = datetime.datetime.now()
    filename = deferredDir + '/' + now.strftime("%Y%m%d-%H%M%S")
    f = csv.writer(open(filename, 'w'), delimiter=',')
    f.writerows(records)

def getDeferredRecords():
    """docstring for getDeferredRecords"""
    for filename in glob.glob(deferredDir + '/*'):
        def_records = csv.reader(open(filename,'r'))
        records.extend(def_records)

我使用csv.writer而不是使用前面的代码块:

f = open(filename, 'w')
newlist = map(lambda(x): str(x)[1:-1], records)
for item in newlist:
        f.write("%s\n" % item)
f.close

感谢所有回复的人!