Python 转换文件格式

Python 转换文件格式,python,unix,formatting,Python,Unix,Formatting,我有以下示例文件(a),我想使用Unix或Python命令将其转换为示例文件(b)。我的实际文件要大得多(几GB) (a) : (b) : 有人能帮忙吗?如果源数据在Chu source.txt中,此脚本将以上面的格式创建Chu dst.txt。但在这个过程中,它将使用大量内存,因为在创建输出文件之前,必须存储所有数据 这是一个Python2脚本。Python3脚本必须使用字节才能节省空间,并且将使用项而不是iteritems 通过进一步研究,您将了解如何在命令行上传递文件名,而不是将它们硬编码

我有以下示例文件(a),我想使用Unix或Python命令将其转换为示例文件(b)。我的实际文件要大得多(几GB)

(a) :

(b) :


有人能帮忙吗?

如果源数据在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
$