与使用 Python 的 txt 文件中的列表进行比较时,如何从 csv 文件中删除行?

How to remove rows from a csv file when compared to a list in a txt file using Python?

我在 .txt 文件中存储了一个包含 12.000 个字典条目的列表(只有单词,没有定义)。

我有一个完整的字典,其中包含 62.000 个条目(单词及其定义)存储在 .csv 文件中。

我需要将 .txt 文件中的小列表与 .csv 文件中的较大列表进行比较,然后 删除包含以下条目的行 没有出现在较小的列表中。换句话说,我想将这本词典清除到只有 12.000 个条目。

.txt 文件的顺序是这样的,逐行排列:

word1

word2

word3

.csv 文件的顺序如下:

ID(第 1 列)WORD(第 2 列)MEANING(第 3 列)

如何使用 Python 完成此操作?

以下内容无法很好地扩展,但应该适用于指示的记录数。

import csv

csv_in = csv.reader(open(path_to_file, 'r'))
csv_out = csv.writer(open(path_to_file2, 'w'))
use_words = open(path_to_file3, 'r').readlines()

lookup = dict([(word, None) for word in use_words])

for line in csv_in:
    if lookup.has_key(line[0]):
        csv_out.writerow(line)

csv_out.close()

当前计算机中鲜为人知的事实之一是,当您从文本文件中删除一行并保存文件时,编辑器通常会这样做:

  1. 将文件加载到内存中
  2. 用你想要的行写一个临时文件
  3. 关闭文件并将临时文件移到原始文件上

所以你必须加载你的单词列表:

with open('wordlist.txt') as i:
    wordlist = set(word.strip() for word in i)  #  you said the file was small

然后你打开输入文件:

with open('input.csv') as i:
    with open('output.csv', 'w') as o:
        output = csv.writer(o)
        for line in csv.reader(i):  # iterate over the CSV line by line
            if line[1] not in wordlist:  # test the value at column 2, the word
                output.writerow(line) 

os.rename('input.csv', 'output.csv')

这是未经测试的,现在去做你的功课,如果你发现任何错误,请在这里评论......:-)

到目前为止答案很好。如果你想要简约...

import csv

lookup = set(l.strip().lower() for l in open(path_to_file3))
map(csv.writer(open(path_to_file2, 'w')).writerow, 
    (row for row in csv.reader(open(path_to_file)) 
    if row[1].lower() in lookup))

我会为此使用 pandas。数据集不大,所以你可以在内存中完成。

import pandas as pd

words = pd.read_csv('words.txt')
defs = pd.read_csv('defs.csv')
words.set_index(0, inplace=True)
defs.set_index('WORD', inplace=True)
new_defs = words.join(defs)
new_defs.to_csv('new_defs.csv')

您可能需要操纵 new_defs 使其看起来像您想要的那样,但这就是它的要点。