Python基于字符串从1个文件创建3个文件
我有一个很大的数据集,它存储在Linux上的一个文件中。我想编写一个python脚本,它将获取这个文件,并根据3个特定字符串的第一次出现将其写入3个文件 我的数据集如下所示:Python基于字符串从1个文件创建3个文件,python,linux,Python,Linux,我有一个很大的数据集,它存储在Linux上的一个文件中。我想编写一个python脚本,它将获取这个文件,并根据3个特定字符串的第一次出现将其写入3个文件 我的数据集如下所示: Handle: A1 OrgID: AA Name: Name1 Handle: A2 OrgID: BB Name: Name2 OrgID: 1111 OrgName: Name1 Street: 1111 Street OrgID: 2222 OrgName: Name2 Street: 2222 Stree
Handle: A1
OrgID: AA
Name: Name1
Handle: A2
OrgID: BB
Name: Name2
OrgID: 1111
OrgName: Name1
Street: 1111 Street
OrgID: 2222
OrgName: Name2
Street: 2222 Street
NetHandle: Net1
OrgID: AA
Parent: Net1
NetHandle: Net2
OrgID: BB
Parent: Net2
我希望第一个文件中的所有条目都以“Handle”开头,并在以“OrgID”开头的条目之前停止。第二个文件中的条目以“OrgID”开头,第三个文件中的条目以“NetHandle”开头最棘手的是OrigID在这三个角色中都有。我从stack和其他站点的示例中尝试了一些方法,但我还没能做到这一点。如果您能提供任何帮助,我们将不胜感激。假设您发布的是文本文件格式,最简单的方法是一次读取4行数据块,然后打开第一行。1
我们可以使用,它可以把任何东西分成任何固定大小的组。但我将向您展示如何在没有配方的情况下进行,因为了解它的工作原理是值得的:
with open('dataset.txt', 'r') as f:
# Create a list with 4 references to the same iterator.
iters = [iter(f)] * 4
# Zip into an iterator that grabs one value from each reference.
chunks = zip(*iters)
# Now each chunk is a tuple of four successive values.
for chunk in chunks:
现在,我们如何打开这些组?这里最简单的做法是制作一个字典,将标签映射到输出文件:
outfiles = {'Handle': handles, 'OrgID': orgs, 'NetHandle': nets}
…然后从每个块中提取标签并查找输出文件:
firstline = chunk[0]
label = firstline.split(':')[0]
outfile = outfiles[label]
这里可能需要一些错误处理。但是如果您非常确定文件中没有与这三种格式中的一种不完全匹配的块,那么这可能就足够了
综合起来:
with open('dataset.txt', 'r') as f, open('handles.txt', 'w') as handles, \
open('orgs.txt', 'w') as orgs, open('nets.txt', 'w') as nets:
outfiles = {'Handle': handles, 'OrgID': orgs, 'NetHandle': nets}
for chunk in zip(*([iter(f)]*4)):
label = chunk[0].split(':')[0]
outfiles[label].writelines(chunk)
或者,如果您使用石斑鱼
配方(您应该):
如果文件实际上没有换行结束,最后一个块将失败。但您可以通过将
'
指定为填充值来轻松解决此问题:
for chunk in grouper(f, 4, ''):
一,。如果您可以假设所有句柄块先出现,然后是所有OrgID块,然后是所有NetHandle块,那么您可以使事情变得更高效一点,尽管没有那么简单。但当我问这是否属实时,你只是回答“它们都是大块的”,这无助于解决歧义。所以,我将写它来处理它们混合的可能性
二,。如果您错了,其中一个块以'Spam:'
开头,您将得到一个KeyError:'Spam'
。或者,如果其中一个块的长度不是4行,那么您最终会失去同步,并将Street:
作为第一行读取,您将得到KeyError:'Street'
。因此,任何意外输入都应该很容易调试。所有条目是否从头到尾都有3行?是否有以“Handle”开头的条目出现在第一次出现“OrgID”之后?考虑使用enumerate
并检查前一行是否为空。输入文件中的那些单点和五点是这样的吗?如果是这样,你甚至不需要打开群组;每个组都是一个句柄
,直到你点击
,然后跳过..
,每个组都是一个组织
,直到你点击
,等等。是的,所有条目从头到尾都有3行@ak_请避免“给我代码”问题。还看到这似乎不起作用。。。所有输出都在句柄中。txt@ak_slick您没有回答
和..
行是否在实际输入文件中。显然,如果它们不在那里,拆分它们将不起作用。@ak_slick尝试新版本。它适用于更新的问题示例。
for chunk in grouper(f, 4, ''):