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

Python处理Twitter爬虫CSV数据:保留指定字段求助

解决Twitter CSV数据冗余:筛选指定字段的Python实现指导

嘿,自学一周就能搞定Twitter数据爬取,这进度相当可以啊!看了你写的代码思路,我明白你想保留指定字段、剔除冗余数据的需求,咱们一步步把代码调整得能用起来~

首先先纠正几个基础的语法和逻辑问题:

  • 开头的导入语句要分开写:import csv和import json(如果你的代码里没用到json可以直接删掉)
  • 你原来的循环里用f.readlines()会把文件指针直接跳到末尾,后面的循环就读不到内容了,绝对不能这么用
  • 判断逻辑搞反啦:你写的if box contains 'created_at': continue是说遇到这个字段就跳过,但你实际是要保留它,应该反过来——只保留你列出的这些字段,其他全部排除

接下来分两种场景给你代码方案,先对应你的CSV格式来选:


场景1:你的CSV是标准表头+行列格式(第一行是字段名,后续每行是一条推文的对应值)

这种情况用Python内置的csv模块最方便,新手优先推荐生成新文件的方式(避免误改原数据,毕竟爬数据不容易):

方案1:生成清洗后的新CSV文件(推荐)

import csv

# 把你要保留的字段列在这里,后续要改直接调整这个列表就行
wanted_fields = [
    'created_at', 'id', 'text', 'source', 'name', 'screen_name',
    'location', 'url', 'description', 'translator_type', 'protected',
    'verified', 'followers', 'friends', 'listed', 'favourites',
    'statuses', 'time', 'lang', 'is_translator', 'default_profile',
    'notification', 'geo', 'coordinates', 'place', 'contributors',
    'quoted_status', 'retweeted_status'
]

# 用with语句自动管理文件,不用手动close,更安全
with open('csvdata.csv', 'r', encoding='utf-8') as infile, open('cleaned_tweets.csv', 'w', newline='', encoding='utf-8') as outfile:
    # DictReader会把每行数据转成字典,直接通过字段名提取值
    reader = csv.DictReader(infile)
    # DictWriter负责写入新文件,指定要保留的字段作为表头
    writer = csv.DictWriter(outfile, fieldnames=wanted_fields)
    
    # 先写入表头行
    writer.writeheader()
    
    # 遍历每条推文数据
    for row in reader:
        # 只提取我们需要的字段,过滤掉冗余内容
        cleaned_row = {field: row[field] for field in wanted_fields if field in row}
        # 写入新文件
        writer.writerow(cleaned_row)

print("数据清洗完成!新文件已保存为 cleaned_tweets.csv")

方案2:直接修改原CSV文件(谨慎使用!建议先备份原文件)

如果一定要直接修改原文件,得先把所有数据读到内存里,再覆盖写入,不然会导致数据丢失:

import csv

wanted_fields = [
    'created_at', 'id', 'text', 'source', 'name', 'screen_name',
    'location', 'url', 'description', 'translator_type', 'protected',
    'verified', 'followers', 'friends', 'listed', 'favourites',
    'statuses', 'time', 'lang', 'is_translator', 'default_profile',
    'notification', 'geo', 'coordinates', 'place', 'contributors',
    'quoted_status', 'retweeted_status'
]

# 第一步:把所有清洗后的数据读到内存里
cleaned_data = []
with open('csvdata.csv', 'r', encoding='utf-8') as infile:
    reader = csv.DictReader(infile)
    # 先检查要保留的字段是否都在原表头里,避免报错
    valid_fields = [field for field in wanted_fields if field in reader.fieldnames]
    for row in reader:
        cleaned_row = {field: row[field] for field in valid_fields}
        cleaned_data.append(cleaned_row)

# 第二步:覆盖写入原文件
with open('csvdata.csv', 'w', newline='', encoding='utf-8') as outfile:
    writer = csv.DictWriter(outfile, fieldnames=valid_fields)
    writer.writeheader()
    # 批量写入所有清洗后的数据,效率更高
    writer.writerows(cleaned_data)

print("原文件已更新!只保留了你指定的字段")

场景2:你的CSV每行是一个完整的Twitter JSON对象(每条推文是JSON字符串存在一行里)

看你导入了json,猜测可能是这种情况——Twitter API返回的是JSON格式,你直接把每条JSON存成了CSV的一行。这种情况需要先把JSON转成字典,再提取嵌套字段:

import csv
import json

# 注意嵌套字段的写法,比如user里的name要写成'user.name'
wanted_fields = [
    'created_at', 'id', 'text', 'source', 'user.name', 'user.screen_name',
    'user.location', 'user.url', 'user.description', 'user.translator_type',
    'user.protected', 'user.verified', 'user.followers_count', 'user.friends_count',
    'user.listed_count', 'user.favourites_count', 'user.statuses_count',
    'user.created_at', 'user.lang', 'user.is_translator', 'user.default_profile',
    'notifications', 'geo', 'coordinates', 'place', 'contributors',
    'quoted_status', 'retweeted_status'
]

# 专门处理嵌套字段的小函数,比如从user字典里取出name
def get_nested_value(data, field):
    keys = field.split('.')
    value = data
    for key in keys:
        try:
            value = value[key]
        except (KeyError, TypeError):
            # 如果字段不存在就返回空字符串
            value = ''
    return value

# 生成清洗后的新文件
with open('csvdata.csv', 'r', encoding='utf-8') as infile, open('cleaned_tweets.csv', 'w', newline='', encoding='utf-8') as outfile:
    writer = csv.writer(outfile)
    # 写入表头
    writer.writerow(wanted_fields)
    
    for line in infile:
        try:
            # 把每行的JSON字符串转成Python字典
            tweet = json.loads(line.strip())
            # 提取每个需要的字段值
            row_values = [get_nested_value(tweet, field) for field in wanted_fields]
            writer.writerow(row_values)
        except json.JSONDecodeError:
            # 跳过解析失败的行(比如空行或者格式错误的行)
            continue

print("数据清洗完成!新文件已保存为 cleaned_tweets.csv")

最后给你几个新手友好的提示:

  1. 永远先备份原数据!尤其是要修改原文件的时候,别辛辛苦苦爬的数据搞丢了
  2. 如果运行代码报错,先看报错信息——比如KeyError就是说你指定的字段在原数据里不存在,调整wanted_fields列表就行
  3. 用with语句打开文件是好习惯,它会自动帮你关闭文件,避免资源泄漏

内容的提问来源于stack exchange,提问作者B. Crull

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:23:51