与使用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行中的无效语法计算错误的参数。。。修好了。