Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何强制每一行具有与最大长度行相同的制表符数_Python_Tab Delimited Text - Fatal编程技术网

Python 如何强制每一行具有与最大长度行相同的制表符数

Python 如何强制每一行具有与最大长度行相同的制表符数,python,tab-delimited-text,Python,Tab Delimited Text,我有一个以制表符分隔的txt,我想使每一行的制表符数量与制表符数量最多的行相同 比如说, A\tB\tC\tD E\t F\tG\t 输入文件: 将成为 A\tB\tC\tD E\t\t\t F\tG\t\t 我正在尝试这个 import sys from itertools import izip_longest import codecs inputf = sys.argv[1] outputf = sys.argv[2] with open(inputf) as f:

我有一个以制表符分隔的txt,我想使每一行的制表符数量与制表符数量最多的行相同

比如说,

A\tB\tC\tD
E\t
F\tG\t
输入文件: 将成为

A\tB\tC\tD
E\t\t\t
F\tG\t\t
我正在尝试这个

import sys
from itertools import izip_longest
import codecs

inputf  = sys.argv[1]
outputf  = sys.argv[2]

with open(inputf) as f:
    data = izip_longest(*(x.split('\t') for x in f), fillvalue='\t')
for line in zip(*data):
    print line,

ofile = codecs.open(outputf, "w")
但输出并没有任何内容,尽管它在命令窗口中打印内容

我希望这个程序不会在命令窗口中打印这些内容(似乎需要很多时间)

我希望输出文件有正确的输出

But output has nothing although it prints things in command window.
这是因为您没有将数据写入文件

按如下方式更改您的程序

with open(inputf) as fin, open(outputf, "w") as fout:
    data = izip_longest(*(x.split('\t') for x in fin), fillvalue='\t')
    fout.write('\n'.join(map(''.join, zip(*data))))
注意,您的程序可能不会给出所需的输出,因为换行符是正在压缩的元素列表中的字符的一部分。你需要从读到的行中去掉新行

    data = izip_longest(*(x.strip().split('\t') for x in f), fillvalue='\t')

尝试使用csv模块,如下所示

#!/usr/bin/env python
import sys
import csv
from itertools import izip_longest

def read_rows(inputfile):
    with open(inputfile, 'rb') as h:
        reader = csv.reader(h, dialect='excel-tab')
        return list(reader)

def write_rows(outputfile, rows):
    with open(outputfile, 'wb') as h:
        writer = csv.writer(h, dialect='excel-tab')
        for row in rows:
            writer.writerow(row)

def show_file(outputfile):
    with open(outputfile, 'r') as h:
        print h.read().splitlines()

def main(inputfile, outputfile):
    rows = read_rows(inputfile)
    rows = zip(*(izip_longest(*rows, fillvalue='')))
    write_rows(outputfile, rows)
    show_file(outputfile)

if __name__ == '__main__':
    inputfile = sys.argv[1]
    outputfile = sys.argv[2]
    main(inputfile, outputfile)
使用您的输入文件:

./normalize.py ~/Downloads/input.txt ~/Downloads/output.txt 
['A\tB\tC\tD', 'E\t\t\t', 'F\tG\t\t']

您在命令窗口中看到输出,因为您正在打印
数据中的内容(它使用
izip_longest()
返回的迭代器)。文件中没有任何内容结束,因为没有数据写入文件,您只打开文件进行写入

我相信以下内容将(仅)满足您的要求:

import sys
from itertools import izip_longest
import codecs

inputf = sys.argv[1]
outputf = sys.argv[2]

with open(inputf) as f:
    data = izip_longest(*(x.strip().split('\t') for x in f), fillvalue='')

with codecs.open(outputf, "w") as ofile:
    ofile.write('\n'.join('\t'.join(items) for items in zip(*data)) + '\n')

也许第二个inputf应该是outputf?我测试了您的原始代码,然后它说“名称f未定义”。因此,我将“x in f”替换为“x in fin”,但这没有提供任何输出,然后将第二个inputf更改为outputf,同样的问题也发生了。这是
write_rows()
函数中的输入文件,您可以只使用一个
writer.writerows(rows)
调用,而不是
for
循环。另外,
show_file()
函数可能不需要,因为OP抱怨将输出打印到命令窗口花费了太多时间。