遍历CSV链接并写入新CSV时遇列拆分异常问题求助
解决CSV写入时逗号未分隔列且字符单独列的问题
你的问题根源在于对csv.writer.writerow()方法的使用理解有误,还有手动拼接字符串的方式不符合CSV写入规范,我来帮你拆解并修复:
问题分析
- writerow需要的是可迭代的字段列表,不是字符串:你现在把拼接好的
newstring传给writerow(),而字符串本身是可迭代对象(每个字符都是一个独立元素),所以CSV writer会把每个字符当成单独的列,这就导致了"每个字符被放入单独列"的问题。 - 手动拼接逗号没必要,还容易出问题:
csv.writer会自动帮你处理字段的分隔(默认是逗号),手动添加逗号不仅多余,还可能在字段本身包含逗号时引发格式错误。
修复方案
我们需要把每个要保存的字段收集到一个列表里,再传给writerow(),同时优化文件操作的安全性(用with语句自动管理文件):
import csv import requests from bs4 import BeautifulSoup # 读取链接文件 with open("hrefs.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) # 用with语句自动管理输出文件,避免资源泄漏 with open("output.csv", "w", newline="", encoding="utf-8") as listFile: writer = csv.writer(listFile) # 可选:写入表头,让CSV结构更清晰 writer.writerow(["标题", "价格", "属性1", "属性2", "属性3"]) for row in reader: newUrl = row[0] try: response = requests.get(newUrl) response.raise_for_status() # 捕获请求失败的情况 newData = response.text newSoup = BeautifulSoup(newData, 'lxml') # 收集字段到列表,替代手动拼接字符串 row_data = [] # 处理标题,加存在性判断避免索引报错 titles = newSoup.findAll('span', {'id': 'titletextonly'}) row_data.append(titles[0].text.strip() if titles else "无标题") # 处理价格 prices = newSoup.findAll('span', {'class': 'price'}) row_data.append(prices[0].text.strip() if prices else "无价格") # 处理属性 for ana in newSoup.findAll('p', {'class':'attrgroup'}): for myb in ana.findAll('b'): row_data.append(myb.text.strip()) # 写入一行完整数据 writer.writerow(row_data) print(",".join(row_data)) # 打印和CSV一致的内容 except Exception as e: print(f"处理链接 {newUrl} 时出错: {str(e)}")
关键修改点
- 用
row_data列表收集每个字段,替代手动拼接带逗号的字符串,让CSV writer自动处理分隔 - 使用嵌套
with语句同时管理输入和输出文件,自动处理文件关闭,避免资源泄漏 - 添加异常处理,避免单个链接出错导致整个程序中断
- 对每个字段做存在性判断,防止
titles[0]这类索引操作引发IndexError - 指定文件编码为
utf-8,避免中文乱码问题 - 添加
newline=""参数,避免Windows系统下CSV出现多余空行
这样修改后,CSV文件会正确将每个字段分隔到不同列,再也不会出现每个字符单独列的问题啦。
内容的提问来源于stack exchange,提问作者maudulus
相关产品推荐
相关产品推荐

