将一个txt文件拆分成N行每行?
Split a txt file into N lines each?
我想将一个非常大的 .txt 文件分成相等的部分文件,每个部分包含 N 行。并将其保存到文件夹
with open('eg.txt', 'r') as T:
while True:
next_n_lines = islice(T, 300)
f = open("split" + str(x.pop()) + ".txt", "w")
f.write(str(next_n_lines))
f.close()
但这会创建一个包含数据的文件
" < itertools.islice object at 0x7f8fa94a4940 >"
在 txt
个文件中。
我想保留与原始 txt
文件相同的结构和样式。
并且此代码在到达文件末尾时也不会自动终止。如果可能的话,我希望代码停止写入文件并退出
没有数据可写。
问题是 itertools.islice
returns 一个迭代器,你在你的文件中写 str
这是 python 中函数的表示(显示身份对象):
< itertools.islice object at 0x7f8fa94a4940 >
作为将迭代器分割成相等部分的更简单的方法,您可以使用以下 grouper
函数,python wiki 将其建议为 itertools recipes
:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
您可以将您的文件对象作为迭代器传递给函数,然后遍历结果并将它们写入您的文件:
with open('eg.txt', 'r') as T:
for partition in grouper(T,300):
# do anything with `partition` like join the lines
# or any modification you like. Then write it in output.
您可以将 iter
与 islice
一起使用,一次使用 n 行,使用枚举为您的文件指定唯一的名称。 f.writelines
将每个行列表写入一个新文件:
with open('eg.txt') as T:
for i, sli in enumerate(iter(lambda:list(islice(T, 300)), []), 1):
with open("split_{}.txt".format(i), "w") as f:
f.writelines(sli)
您的代码将永远循环,因为您不包含任何中断条件,将 iter
与空列表一起使用将意味着循环在迭代器耗尽时结束。
此外,如果您想传递要写入的 islice 对象,您只需调用 writelines
即可,即 f.writelines(next_n_lines)
、str(next_n_lines)
。
我想将一个非常大的 .txt 文件分成相等的部分文件,每个部分包含 N 行。并将其保存到文件夹
with open('eg.txt', 'r') as T:
while True:
next_n_lines = islice(T, 300)
f = open("split" + str(x.pop()) + ".txt", "w")
f.write(str(next_n_lines))
f.close()
但这会创建一个包含数据的文件
" < itertools.islice object at 0x7f8fa94a4940 >"
在 txt
个文件中。
我想保留与原始 txt
文件相同的结构和样式。
并且此代码在到达文件末尾时也不会自动终止。如果可能的话,我希望代码停止写入文件并退出 没有数据可写。
问题是 itertools.islice
returns 一个迭代器,你在你的文件中写 str
这是 python 中函数的表示(显示身份对象):
< itertools.islice object at 0x7f8fa94a4940 >
作为将迭代器分割成相等部分的更简单的方法,您可以使用以下 grouper
函数,python wiki 将其建议为 itertools recipes
:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
您可以将您的文件对象作为迭代器传递给函数,然后遍历结果并将它们写入您的文件:
with open('eg.txt', 'r') as T:
for partition in grouper(T,300):
# do anything with `partition` like join the lines
# or any modification you like. Then write it in output.
您可以将 iter
与 islice
一起使用,一次使用 n 行,使用枚举为您的文件指定唯一的名称。 f.writelines
将每个行列表写入一个新文件:
with open('eg.txt') as T:
for i, sli in enumerate(iter(lambda:list(islice(T, 300)), []), 1):
with open("split_{}.txt".format(i), "w") as f:
f.writelines(sli)
您的代码将永远循环,因为您不包含任何中断条件,将 iter
与空列表一起使用将意味着循环在迭代器耗尽时结束。
此外,如果您想传递要写入的 islice 对象,您只需调用 writelines
即可,即 f.writelines(next_n_lines)
、str(next_n_lines)
。