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

与使用Python的txt文件中的列表相比,如何从csv文件中删除行?,python,csv,dictionary,Python,Csv,Dictionary,我在.txt文件中存储了12000个字典条目(仅单词,没有定义)的列表 我有一本完整的字典,里面有62000个条目(单词及其定义)存储在.csv文件中 我需要将.txt文件中的小列表与.csv文件中的大列表进行比较,然后删除包含小列表中未显示的条目的行。换句话说,我想把这本词典的词条清理到12000个 .txt文件按如下方式逐行排列: word1 word2 word3 .csv文件的顺序如下: ID(第1列)单词(第2列)含义(第3列) 如何使用Python实现这一点 以下内容不能很好地扩展,

我在
.txt
文件中存储了12000个字典条目(仅单词,没有定义)的列表

我有一本完整的字典,里面有62000个条目(单词及其定义)存储在
.csv
文件中

我需要将
.txt
文件中的小列表与
.csv
文件中的大列表进行比较,然后删除包含小列表中未显示的条目的行。换句话说,我想把这本词典的词条清理到12000个

.txt
文件按如下方式逐行排列:

word1

word2

word3

.csv
文件的顺序如下:

ID(第1列)单词(第2列)含义(第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()

当前计算机的一个鲜为人知的事实是,当您从文本文件中删除一行并保存该文件时,大多数情况下编辑器都会执行以下操作:

  • 将文件加载到内存中
  • 编写一个包含所需行的临时文件
  • 关闭文件并将临时文件移到原始文件上
  • 因此,您必须加载您的单词列表:

    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))
    

    我会用熊猫来做这个。数据集不是很大,所以可以在内存中进行,不会有任何问题

    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')
    

    您可能需要操纵新的定义,使其看起来像您希望的那样,但这就是它的要点。

    我会考虑使用类似sqlite的数据库,并使用ExecuteMy将数据写入csv?您不删除行,而是打开输入文件,迭代每一行,测试它是否与所需行匹配,将要写入临时文件的行写入临时文件,并在完成后将此临时文件移到原始文件上。@PauloScardine,OP必须对单词与列表匹配的行进行索引搜索,这在我的工作中效率很低opinion@Anzel,我正在搜索如何使用ExecuteMy。@PauloScardine,您是否有一个使用库csv的示例代码?
    lookup=set(l.rstrip()表示l处于打开状态(路径\u到\u文件3))
    占用的内存更少。当然,摆脱中间使用的单词是一种性能改进,但可能会以显示正在发生的事情为代价。我想知道集合的搜索速度是否比散列键快,但是。。。听起来是时候做个实验了。:-)集合是没有值的dict。您节省了值对象的时间和内存占用,因此它们可以更好地扩展。啊。。。这很有道理。谢谢我刚刚复制并粘贴了你的代码,但它只是写了一个空文件。我得到了语法错误:第11行中的无效语法计算错误的参数。。。修好了。