update-my file.txt.zp是制表符分隔的,看起来像这样: file.txt.zp 我想将第一个col分割为:_ /
原帖: 我有一个非常大的压缩制表符分隔文件。 我想打开它,一次扫描一行,拆分一些col,然后将其写入新文件。 我得到了各种错误(每次我修复另一个pops) 这是我的代码:
import csv
import re
import gzip
f = gzip.open('file.txt.gz')
original = f.readlines()
f.close()
original_l = csv.reader(original)
for row in original_l:
file_l = re.split('_|:|/',row)
with open ('newfile.gz', 'w', newline='') as final:
finalfile = csv.writer(final,delimiter = ' ')
finalfile.writerow(file_l)
谢谢!
对于这段代码我得到了错误:
for row in original_l:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
所以基于我在这里找到的内容,我在f.close()之后添加了这个:
original = original.decode('utf8')
然后得到错误:
original = original.decode('utf8')
AttributeError: 'list' object has no attribute 'decode'
答案 0 :(得分:2)
更新2
此代码应生成您之后的输出。
import csv
import gzip
import re
with gzip.open('file.txt.gz', mode='rt') as f, \
open('newfile.gz', 'w') as final:
writer = csv.writer(final, delimiter=' ')
reader = csv.reader(f, delimiter='\t')
_ = next(reader) # skip header row
for row in reader:
writer.writerow(re.split(r'_|:|/', row[0]))
<强>更新强>
以文本模式打开gzip文件,因为Python 3中的CSV模块需要str
个对象。
f = gzip.open('file.txt.gz', 'rt')
在创建csv.reader
时指定分隔符。
original_l = csv.reader(original, delimiter='\t')
这将让你超越第一道障碍。
现在您需要解释数据是什么,您希望提取哪些列以及输出应该是什么样的。
原始答案如下......
一个明显的问题是输出文件不断被下一行输入覆盖。这是因为输出文件每行一次以(超过)写入模式(“&#39; w``”)打开。
最好在循环外打开输出文件。
此外,创建阅读器时未指定CSV文件分隔符。您说该文件是制表符分隔的,因此请指定:
original_l = csv.reader(original, delimiter='\t')
另一方面,您的代码尝试使用其他分隔符分割每一行,但是,来自csv.reader
的行表示为列表,而不是re.split()
代码所需的字符串
另一个问题是输出文件没有像顾名思义那样压缩。