Python中csv.writerow函数使用异常:写入文本文件后字符间出现空格
问题根源&解决方案
嘿,我来帮你理清这个问题!你看到的每个字符间的“空格”其实是你指定的制表符\t,之所以会出现这种情况,核心原因是:从config.ini里读出来的header_1和header_2是字符串,不是真正的Python列表。
举个例子,你读取到的header_1实际是一串文本:"['*****data*****']",而不是一个包含单个元素的列表。当你把这个字符串传给writerow()时,csv模块会把它当成可迭代对象,逐个遍历每个字符,然后用\t分隔每个字符写入文件——这就导致了每个字符之间都被制表符隔开,看起来像是有空格。
快速修复方案
我们需要把读取到的字符串转换成真正的列表,这里推荐用ast.literal_eval()来做,它能安全地把符合Python字面量格式的字符串转成对应的对象(比直接用eval()安全多了,不会执行恶意代码)。
修改后的代码如下:
import csv import configparser import ast # 新增导入ast模块 # 读取配置文件 config = configparser.ConfigParser() config.read(r'C:\data\FF\Desktop\Studio\cfg.ini') # 将字符串格式的配置转成真正的列表 header_1 = ast.literal_eval(config['HEADERS']['headers_1']) header_2 = ast.literal_eval(config['HEADERS']['headers_2']) full_path = r'C:\data\FF\Desktop\Studio\New Text Document.txt' with open(full_path, 'w') as output: writer = csv.writer(output, delimiter='\t') writer.writerow(header_1) writer.writerow(header_2)
更规范的配置写法(可选)
其实你的config.ini里的列表写法并不符合ini文件的标准规范,标准ini通常用逗号分隔值,这样处理起来更简单,也不容易出错。比如把cfg.ini改成这样:
[HEADERS] headers_2 = VEHICLE,MODEL,DSG,YEAR,MONTH,DAY,HOUR,MINUTE,SECOND headers_1 = *****data*****
对应的代码转换也更简洁:
header_1 = [config['HEADERS']['headers_1']] # 把单个值包装成列表,适配writerow的要求 header_2 = config['HEADERS']['headers_2'].split(',')
这样就不用依赖ast模块,代码也更符合ini文件的使用习惯~
内容的提问来源于stack exchange,提问作者Mediterráneo
相关产品推荐
相关产品推荐

