我有一个包含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()
错误:列表不属性写。
答案 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)