新手在这里。最终任务是学习如何获取两个大Yaml文件并将它们拆分为数百个小文件。我还没有弄清楚如何使用ID#作为文件名,所以一次只能做一件事。
首先:将大文件分成多个文件。这是我的测试数据文件test-file.yml的一小部分。每个帖子单独在一行上都有-分隔符:
-
ID: 627
more_post_meta_data_and_content
-
ID: 628
这是我的代码不起作用。到目前为止,我还不明白为什么:
with open('test-file.yml', 'r') as myfile:
start = 0
cntr = 1
holding = ''
for i in myfile.read().split('\n'):
if (i == '-\n'):
if start==1:
with open(str(cntr) + '.md','w') as opfile:
opfile.write(op)
opfile.close()
holding=''
cntr += 1
else:
start=1
else:
if holding =='':
holding = i
else:
holding = holding + '\n' + i
myfile.close()
欢迎所有提示,建议和指针。谢谢。
答案 0 :(得分:0)
作为一个新手,乍一看,您尝试向输出中写入未声明的变量op。您快要准备好了,只需要遍历opfile并编写内容:
with open('test-file.yml', 'r') as myfile:
start = 0
cntr = 1
holding = ''
for i in myfile.read().split('\n'):
if (i == '-\n'):
if start==1:
with open(str(cntr) + '.md','w') as opfile:
for line in opfile:
op = line
opfile.write(op)
opfile.close()
holding=''
cntr += 1
else:
start=1
else:
if holding =='':
holding = i
else:
holding = holding + '\n' + i
myfile.close()
希望这会有所帮助!
答案 1 :(得分:0)
在打开的文件中使用with context
时,with
将在退出此块时自动为您关闭文件。因此,您无需在任何地方使用file.close()
。
有一个名为readlines
的函数,该函数输出一个生成器,该生成器一次从一个打开的文件中读取一行。这将比read()
后跟split()
的工作效率更高。想一想。您正在将一个巨大的文件加载到内存中,然后要求CPU用\n
字符分割该巨大文本。不是很有效。
您写了opfile.write(op)
。 op
在哪里定义?您是否不想在定义的holding
中写内容?
尝试以下操作。
with open('test.data', 'r') as myfile:
counter = 1
content = ""
start = True
for line in myfile.readlines():
if line == "-\n" and not start:
with open(str(counter) + '.md', 'w') as opfile:
opfile.write(content)
content = ""
counter += 1
else:
if not start:
content += line
start = False
# write the last file if test-file.yml doesn't end with a dash
if content != "":
with open(str(counter) + '.md', 'w') as opfile:
opfile.write(content)