You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python写入CSV时字符串被逐字符遍历的问题及解决方法

解决CSV文件写入时字符串被拆分为单个字符的问题

问题根源

你代码里的核心问题出在这段逻辑:

for i in output:
    writer.writerow([i])

字符串在Python里是可迭代对象,当你用for i in output遍历的时候,会逐个取出字符串里的每个字符,所以每个字符被作为单独一行写入了CSV,这就导致了最终文件里全是单个字符的行。

另外还有一个小问题:你每次循环都用open('c:\csv\pdftable.csv', 'wt')打开文件,wt模式会清空文件原有内容,所以最终CSV里只会保留最后一条符合条件的记录,而不是所有记录。

修正方案

我们需要做两个关键改动:

  1. 把文件打开操作移到循环外面(或者使用追加模式,但更推荐一次性打开保持写入状态)
  2. 直接将完整的记录作为列表传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:12:49