一次写多个文件

时间:2012-12-10 09:47:49

标签: python file

我有一个包含196个列表的文件,我想创建新的196个输出文件,并将每个列表写入一个新文件,这样我将有196个输出文件,每个文件包含1个输入数据列表 这是输入文件:

"['128,129', '116,118', '108,104', '137,141', '157,144', '134,148', '138,114', '131,138', '248,207', '208,247', '246,248', '101,106', '131,115', '119,120', '131,126', '138,137', '132,129']"
"['154,135', '151,147', '236,244', '243,238', '127,127', '125,126', '122,124', '123,126', '127,129', '122,121', '147,134', '126,132', '128,137', '233,222', '222,236', '125,126']"

.....这里,例如,我只给出了2个列表,但总共有196个列表。 输出应该是:

文件1:

128,129
116,118
108,104

file2:

154,135
151,147
236.244

当前代码:

fn = open("/home/vidula/Desktop/project/ori_tri/inpt.data","r")
fnew = fn.read()
fs = fnew.split('\n')
for value in fs:
    f = [open("/home/vidula/Desktop/project/ori_tri/input_%i.data" %i,'w') for i in range(len(list_of_files))]
    f.write(value)
    f.close()

错误:列表不属性写。

5 个答案:

答案 0 :(得分:8)

您当前的代码正在将所有内容加载到内存中,这是非常不必要的,然后它会在不合适的位置创建列表,从而导致错误。试试这个:

fn = open("/home/vidula/Desktop/project/ori_tri/inpt.data","r")
for i, line in enumerate(fn):
    f = open("/home/vidula/Desktop/project/ori_tri/input_%i.data" %i,'w')
    f.write(line)
    f.close()

这将只按原样写入每个文件。查找我用于编制索引的enumerate函数。

完成此操作后,您仍然需要编写解析逻辑以将每一行转换为一系列行...我不会在这里为您执行此操作,因为您的原始代码实际上没有逻辑它要么。

答案 1 :(得分:1)

你的f是一个文件列表,你必须遍历它:

for file in f:
   file.write(value)

答案 2 :(得分:1)

你不能让python在list对象的list类中看作列表理解中的iterable。该列表与write()方法不兼容。在python列表中附加。

假设您的数据文件已在文件中有新行,请创建一个过滤器对象以删除空行然后迭代:

string1 = '128,129', '134, 167', '127,189'
string2 = '154, 134', '156, 124', '138, 196'
l1 = list(string1)
l2 = list(string2)
data = [l1, l2]
f = open("inpt.data", "w")
for val in data:
    f.write(str(val))
    f.write('\n')
f.close()

with open("inpt.data", "r", encoding='utf-8') as fs:
    reader = fs.read()
    file = reader.split('\n')
    file = filter(None, file)

最简单的方法:

# create one file for each list of data (1) on every new line 
i = 0
for value in file:
    i += 1
    f = open("input_%s.data" % i, 'w')
    f.write(value)
fs.close()

pythonic简单方法:

for i, line in enumerate(file):
    fi = open("input_%s.data" % i, 'w')
    fi.write(line)
fs.close()

答案 3 :(得分:0)

我假设您要读取196个文件,然后将数据(经过一些修改后)写入新的196个文件。如果你使用maps和reduce(函数式编程),它可以做你想要的。虽然在这个问题上没有太多解释,但我无能为力。

def modify(someString):
    pass # do processing

def newfiles(oldfilename): return '%s.new.txt'%(oldfilename) # or something 

filenames = ('a', 'b', 'c', 'd', ....) 
handles = [(open(x, 'r'), open(newfile(x), 'w')) for x in filenames] # not using generator
tmp = [y[1].write(modify(y[0].read())) for y in handles) 

答案 4 :(得分:0)

我认为这就是你要找的东西:

with open("/home/vidula/Desktop/project/ori_tri/inpt.data","r") as fn:
    listLines = fn.readlines()

for fileNumber, line in enumerate(listLines):
    with open("/home/vidula/Desktop/project/ori_tri/input{0}.data".format(fileNumber), "w") as fileOutput:
        fileOutput.write(line)