Python实现文件指定列提取及列表格式取消方法
问题:从压缩文本文件提取指定列并去除列表格式输出
示例输入文件(abc.txt.gz)
bit address data code new 0 0FA34B 0002623748594759834784648294918748734610484 123 00000001 1 AB102C 2814699837426459814735985739460746706706600 124 00000002 1 C102BC 1237748798359846709648378598089837658736738 125 00000003
需求
提取第3列(data)和第5列(new)到新文件data.txt,预期输出:
0002623748594759834784648294918748734610484 00000001 2814699837426459814735985739460746706706600 00000002 1237748798359846709648378598089837658736738 00000003
当前尝试代码及错误输出
尝试代码
for l in fin: if l.strip("\n '"): column = l.split(" ") fout.write("%s %s \n" % (column[3:4], column[4:5]))
错误输出
--name of file --data of file [] [] [''] [''] ['0002623748594759834784648294918748734610484'] ['00000001'] ['2814699837426459814735985739460746706706600'] ['00000002'] ['1237748798359846709648378598089837658736738'] ['00000003']
解决方案
问题根源
- 切片导致列表输出:
column[3:4]和column[4:5]是切片操作,返回的是子列表(哪怕只有一个元素),所以输出会带[]和引号。要取单个元素,应该用单个索引(比如column[2])。 - 分割方式错误:
split(" ")会把多个连续空格拆成空字符串元素,导致索引混乱,应该用无参数的split(),自动分割任意空白符(包括多空格、换行、制表符)。 - 未处理压缩文件:原文件是
.gz压缩格式,需要用gzip模块读取。
修正后的完整代码
import gzip # 打开压缩输入文件和输出文件 with gzip.open('abc.txt.gz', 'rt', encoding='utf-8') as fin, open('data.txt', 'w', encoding='utf-8') as fout: # 跳过第一行表头 next(fin) for line in fin: stripped_line = line.strip() # 跳过空行 if not stripped_line: continue # 按任意空白分割列 columns = stripped_line.split() # 第3列对应索引2,第5列对应索引4(Python是0开始索引) fout.write(f"{columns[2]} {columns[4]}\n")
关键说明
with语句自动管理文件的打开和关闭,避免资源泄漏。gzip.open的rt模式表示以文本模式读取压缩文件。next(fin)跳过表头行,只处理数据行。split()无参数时,会自动忽略连续的空白符,得到干净的列列表。- 使用f-string格式化输出,直接取单个元素,不会出现列表格式。
关于“取消列表格式(unlist)”的说明
在Python中如果拿到单个元素的列表,想要获取元素本身:
- 直接取索引:比如列表
my_list = ['abc'],用my_list[0]就能拿到字符串'abc'。 - 避免切片:切片操作(比如
my_list[0:1])永远返回列表,哪怕只有一个元素;用单个索引(my_list[0])才会返回元素本身。
内容的提问来源于stack exchange,提问作者LP_08
相关产品推荐
相关产品推荐

