除了标题格式(number_of_lines,number_difference,“Sam”)之外,我还需裁剪超过10000行数字的大型文本文件
Number_difference是第一个和最后一个数字之间的差异。
例如,如果文件如下所示:
10
12
13.5
17
20
然后,标题应为: 5 10山姆
问题是标志不能多次写入标题并且大文件的标题会转移到第一个小文件。
每个文件的标题永远不会相同。
如何为每个文件添加更改标题?
def TextCropper():
lines_per_file = 1000
smallfile = None
with open(inputFileName) as bigfile:
for lineno, line in enumerate(bigfile):
if lineno % lines_per_file == 0:
if smallfile:
smallfile.close()
small_filename = 'small_file_{}.txt'.format(lineno + lines_per_file)
smallfile = open(small_filename, "w")
if (flags[counter] == False):
smallfile.write(lines_per_file)
flags[counter] = True
smallfile.write(line)
elif smallfile:
smallfile.close()
TextCropper()
答案 0 :(得分:1)
您一次只能读取和写入一行,这是低效的。通过这样做,您也不知道最后一行是什么,因此您无法提前写下您的标题。
如果可用,只需读取N行。 islice()
会为您做到这一点。如果列表返回空,则没有剩余行可读,否则您可以继续将当前块写入文件。
由于每一行都被读作带有尾随换行符的数字(' \ n'),因此将第一行和最后一个数字转换为浮点数并计算差值。通过连接列表的元素,可以直接将实际数字写入文件。
要使函数可重用,请包含可能作为参数更改的变量。这样,您可以命名任何大文件,任何输出小文件和任意数量的行,而无需更改硬编码值。
from itertools import islice
def number_difference(iterable):
return float(iterable[-1].strip('\n')) - float(iterable[0].strip('\n'))
def file_crop(big_fname, chunk_fname, no_lines):
with open(big_fname, 'r') as big_file:
ifile = 0
while True:
data = list(islice(big_file, no_lines))
if not data:
break
with open('{}_{}.txt'.format(chunk_fname, ifile), 'w') as small_file:
small_file.write('{} {} Sam\n'.format(len(data), number_difference(data)))
small_file.write(''.join(data))
ifile += 1