Python写入CSV时字符串被逐字符遍历的问题及解决方法
解决CSV文件写入时字符串被拆分为单个字符的问题
问题根源
你代码里的核心问题出在这段逻辑:
for i in output: writer.writerow([i])
字符串在Python里是可迭代对象,当你用for i in output遍历的时候,会逐个取出字符串里的每个字符,所以每个字符被作为单独一行写入了CSV,这就导致了最终文件里全是单个字符的行。
另外还有一个小问题:你每次循环都用open('c:\csv\pdftable.csv', 'wt')打开文件,wt模式会清空文件原有内容,所以最终CSV里只会保留最后一条符合条件的记录,而不是所有记录。
修正方案
我们需要做两个关键改动:
- 把文件打开操作移到循环外面(或者使用追加模式,但更推荐一次性打开保持写入状态)
- 直接将完整的记录作为列表传入
writerow(),而不是遍历字符串的每个字符
下面是修正后的完整代码:
import requests import json import pandas as pd import sys import csv # 使用原始字符串避免Windows路径转义问题 df = pd.read_table(r'c:\csv\input1.csv', engine='python', sep="\s*,\s*", skipinitialspace=True, usecols=[0, 1], header='infer') count = 0 # 先打印表头 print('Account Name,Private Ip,Result') # 打开文件并保持写入状态,用newline=''避免CSV出现空行 with open(r'c:\csv\pdftable.csv', 'wt', newline='') as csvfile: writer = csv.writer(csvfile, delimiter=',') # 先写入表头 writer.writerow(['Account Name', 'Private Ip', 'Result']) for index, row in df.iterrows(): headers = { 'X-Requested-By': 'cli', 'Accept': 'application/json', 'Content-Type': 'application/json', } params = ( ('query', row["Private Ip"]), ('range', '86400'), ('limit', '100'), ('sort', 'timestamp:desc'), ('pretty', 'true'), ) response = requests.get('http://xxx.xx.xxx.xxx:9000/api/search/universal/relative', headers=headers, params=params, auth=('xxxxxxx', 'xxxxxxxx')) pretty_json = json.loads(response.text) if pretty_json.get('messages'): # 将记录整理为列表,直接写入一行 output_row = [row['Account Name'], row['Private Ip'], 'Yes'] writer.writerow(output_row) print(','.join(output_row)) else: output_row = [row['Account Name'], row['Private Ip'], 'No'] # 即使是No的情况,也可以选择写入CSV(根据你的需求调整) # writer.writerow(output_row) print(','.join(output_row)) count += 1
关键改动说明
- 路径处理:用
r'c:\csv\...'原始字符串避免Windows路径中的转义字符问题(比如\c可能被解析为转义序列) - 文件打开时机:把
with open()放在循环外面,确保所有记录都写入同一个文件,不会被覆盖 - 写入逻辑:直接构造包含列值的列表
output_row,传给writerow(),这样整行内容会被正确写入CSV,每个列表元素对应一列 - 表头写入:主动写入CSV表头,让输出文件结构更清晰
- newline='':这是Python csv模块的推荐写法,避免在Windows系统下生成的CSV出现多余的空行
可选优化
如果你希望把"No"的记录也写入CSV,只需要取消注释# writer.writerow(output_row)这一行即可。
内容的提问来源于stack exchange,提问作者asp
相关产品推荐
相关产品推荐

