Python 转换文件格式
我有以下示例文件(a),我想使用Unix或Python命令将其转换为示例文件(b)。我的实际文件要大得多(几GB) (a) : (b) :Python 转换文件格式,python,unix,formatting,Python,Unix,Formatting,我有以下示例文件(a),我想使用Unix或Python命令将其转换为示例文件(b)。我的实际文件要大得多(几GB) (a) : (b) : 有人能帮忙吗?如果源数据在Chu source.txt中,此脚本将以上面的格式创建Chu dst.txt。但在这个过程中,它将使用大量内存,因为在创建输出文件之前,必须存储所有数据 这是一个Python2脚本。Python3脚本必须使用字节才能节省空间,并且将使用项而不是iteritems 通过进一步研究,您将了解如何在命令行上传递文件名,而不是将它们硬编码
有人能帮忙吗?如果源数据在Chu source.txt中,此脚本将以上面的格式创建Chu dst.txt。但在这个过程中,它将使用大量内存,因为在创建输出文件之前,必须存储所有数据 这是一个Python2脚本。Python3脚本必须使用字节才能节省空间,并且将使用
项而不是iteritems
通过进一步研究,您将了解如何在命令行上传递文件名,而不是将它们硬编码到脚本中
#! /usr/bin/env python2
import collections
def translate(srcf, dstf):
by_chem = collections.defaultdict(list)
with open(srcf, 'rb') as f:
for line in f:
values = line.split()
if not values:
continue
soln = values.pop(0)
for chem in values:
by_chem[chem].append(soln)
with open(dstf, 'wb') as f:
for chem, solns in sorted(by_chem.iteritems()):
f.write('%s\t%s\n' % (chem, '\t'.join(solns)))
translate('ch_source.txt', 'ch_dst.txt')
基本上,你需要阅读文件的每一行,把每一行分成它的组成词,然后记录每一个分子的溶液。在python中,存储这些信息的最自然的数据结构是dict。键是分子,值是包含分子的解决方案列表。构建dict后,只需将每个条目写入一个文件
这应该足以让你开始。试一试,如果你不能让它正常工作,请带着具体的问题回来。我将提供3种解决方案——Awk、Perl和Python 2
Awk
这是一个运行awk
的shell脚本:
#!/bin/sh
awk '{ for (i = 2; i <= NF; i++) list[$i] = list[$i] " " $1 }
END { for (i in list) printf "%-7s %s\n", i, list[i] }' "$@"
示例输出
awk
不会尝试对键进行排序。通过管道将输出传输到sort-f
可以获得与Perl和Python相同的不区分大小写的排序输出。我投票结束这个问题,因为它不是一个编码服务。您尝试了什么?什么(内置)Python数据结构最合适?基本任务很简单。看起来你甚至不需要对输出中的化学代码进行排序。嗨@JonathanLeffler,谢谢你的回复。我尝试了一些shell脚本(Unix),看看是否可以像文件(b)中那样对解决方案进行集群。我知道如何编写代码(只在短短的几周内开始),因此非常感谢您提供的任何建议;这是否意味着您正在学习Python?或者您正在学习shell脚本和使用(比如)awk
或Perl的解决方案吗?我再次强调我先前评论中的问题。您尝试过什么?哪种数据结构最适合存储信息?我正在尝试学习Python,我已经开始了一些基本的在线练习,并将在未来几周内参加一系列研讨会。awk或Perl是最可以接受的。我已经写了一个shell脚本,我希望它能够随机打印一种化学物质,然后从数据库中删除该化学物质并重复,直到数据库为空,除非我错了,数组是完美的,只要(b)是输出。谢谢
#! /usr/bin/env python2
import collections
def translate(srcf, dstf):
by_chem = collections.defaultdict(list)
with open(srcf, 'rb') as f:
for line in f:
values = line.split()
if not values:
continue
soln = values.pop(0)
for chem in values:
by_chem[chem].append(soln)
with open(dstf, 'wb') as f:
for chem, solns in sorted(by_chem.iteritems()):
f.write('%s\t%s\n' % (chem, '\t'.join(solns)))
translate('ch_source.txt', 'ch_dst.txt')
#!/bin/sh
awk '{ for (i = 2; i <= NF; i++) list[$i] = list[$i] " " $1 }
END { for (i in list) printf "%-7s %s\n", i, list[i] }' "$@"
#!/usr/bin/env perl
use strict;
use warnings;
my %list = ();
while (<>)
{
my ($chem, @soln) = split;
push @{$list{$_}}, $chem foreach (@soln);
}
for my $key (sort { lc($a) cmp lc($b) } keys %list)
{
printf "%-7s %s\n", $key, join(' ', @{$list{$key}});
}
#!/usr/bin/env python
import fileinput
list = {}
for line in fileinput.input():
bits = line.split()
for i in range(1, len(bits)):
if bits[i] not in list:
list[bits[i]] = []
list[bits[i]].append(bits[0])
for key in sorted(list.keys(), key = str.lower):
print "%-7s %s" % (key, ' '.join(list[key]))
$ sh so.32062773.sh so.32062773.data
NaCl Sol_00000001 Sol_00000002 Sol_00000002 Sol_00000006 Sol_00000009
H2O2 Sol_00000001 Sol_00000004 Sol_00000009
KNMO4 Sol_00000001 Sol_00000005 Sol_00000009
KOCl Sol_00000003 Sol_00000007 Sol_00000009
NHO2 Sol_00000003 Sol_00000003 Sol_00000008 Sol_00000009
$ perl so.32062773.pl so.32062773.data
H2O2 Sol_00000001 Sol_00000004 Sol_00000009
KNMO4 Sol_00000001 Sol_00000005 Sol_00000009
KOCl Sol_00000003 Sol_00000007 Sol_00000009
NaCl Sol_00000001 Sol_00000002 Sol_00000002 Sol_00000006 Sol_00000009
NHO2 Sol_00000003 Sol_00000003 Sol_00000008 Sol_00000009
$ python so.32062773.py so.32062773.data
H2O2 Sol_00000001 Sol_00000004 Sol_00000009
KNMO4 Sol_00000001 Sol_00000005 Sol_00000009
KOCl Sol_00000003 Sol_00000007 Sol_00000009
NaCl Sol_00000001 Sol_00000002 Sol_00000002 Sol_00000006 Sol_00000009
NHO2 Sol_00000003 Sol_00000003 Sol_00000008 Sol_00000009
$