Python 如何强制每一行具有与最大长度行相同的制表符数
我有一个以制表符分隔的txt,我想使每一行的制表符数量与制表符数量最多的行相同 比如说,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:
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抱怨将输出打印到命令窗口花费了太多时间。