Python CSV写入行被覆盖问题:筛选英文推特数据
解决Twitter CSV数据清洗的两个核心问题:筛选英文推文+避免文件覆盖
嘿,我来帮你搞定这个问题!你遇到的两个主要问题:一是文件被反复覆盖导致只剩最后一条英文推文,二是语言列不固定怎么准确筛选,我都给你理清楚并修正代码。
先说说你原来代码的问题
你每次找到符合条件的行时,都用with open('cleaned.csv', 'w')打开文件——w模式是清空文件后重新写入,所以之前写入的所有内容都会被覆盖,最后自然只剩最后一条匹配的推文。另外,col == 'lang:"en"'的判断可能太死板,万一有些行的语言标识只是en或者列名是language,就会漏判。
修正后的完整代码
下面的代码不仅解决了覆盖问题,还能灵活筛选英文推文,同时去除所有标点:
import csv import string # 获取所有需要去除的标点符号(包含标准英文标点) punctuation_chars = string.punctuation # 同时打开输入和输出文件,用with语句自动管理文件关闭 with open('twitDB.csv', 'r') as input_csv, open('cleaned.csv', 'w', newline='') as output_csv: reader = csv.reader(input_csv) writer = csv.writer(output_csv, delimiter=',') for row in reader: # 跳过原数据中的空行 if not row: continue # 遍历当前行的所有列,检查是否是英文推文 is_en_tweet = False for column in row: # 这里可以根据你的实际数据格式调整判断条件 # 比如匹配纯'en',或者'lang:"en"',甚至包含'english'的字段 cleaned_col = column.strip() if cleaned_col == 'en' or cleaned_col == 'lang:"en"': is_en_tweet = True break if is_en_tweet: # 对当前行的所有内容去除标点(如果只想处理推文文本列,可以单独指定列索引) cleaned_row = [] for item in row: # 过滤掉标点字符 cleaned_item = ''.join([char for char in item if char not in punctuation_chars]) cleaned_row.append(cleaned_item) # 写入清洗后的行 writer.writerow(cleaned_row)
代码关键细节解释
- 避免文件覆盖:我把输出文件的打开操作放在循环外面,用
w模式只打开一次,所有符合条件的行都会依次写入,不会清空之前的内容。 - 灵活筛选英文推文:遍历每行的所有列,检查是否匹配英文标识,你可以根据实际数据调整判断条件(比如如果有些行的语言列是
English,就把判断改成cleaned_col.lower() in ['en', 'english', 'lang:"en"'])。 - 去除标点:用
string.punctuation获取所有标准英文标点,通过列表推导式过滤掉每个单元格里的标点字符。 - 跳过空行:原数据推文之间有空行,用
if not row跳过这些无效行,避免写入空内容。
额外优化建议
如果你的CSV文件有表头,还可以更高效地找到语言列,不用遍历所有列:
# 先读取表头 header = next(reader) lang_col_index = None # 找到包含'lang'或'language'的列索引(不区分大小写) for idx, col_name in enumerate(header): if 'lang' in col_name.lower(): lang_col_index = idx break # 后续处理每行时,直接检查对应列的值 if lang_col_index is not None and row[lang_col_index].strip() == 'en': # 处理并写入行
这样就能精准定位语言列,提升处理速度,尤其是数据量很大的时候。
内容的提问来源于stack exchange,提问作者user1098432
相关产品推荐
相关产品推荐

