![](/img/trans.png)
[英]How do you copy lines that contain specific strings from a .csv file to a .txt file in Python using %BASH?
[英]How to copy entire row of excel (.csv) which contain specific words into another csv file using python?
我必須將包含特定單詞的所有行復制到花葯csv
文件中。
我的文件在.csv
,我想復制其中一個單元格中包含“加拿大”一詞的所有行。 我已經嘗試了互聯網上給出的各種方法。 但我無法復制我的行。 我的數據包含超過 15,000 行。
我的數據集示例包括:
tweets date area
dbcjhbc 12:4:19 us
cbhjc 3:3:18 germany
cwecewc 5:6:19 canada
cwec 23:4:19 us
wncwjwk 9:8:18 canada
代碼是:
import csv
with open('twitter-1.csv', "r" ,encoding="utf8") as f:
reader = csv.DictReader(f, delimiter=',')
with open('output.csv', "w") as f_out:
writer = csv.DictWriter(f_out, fieldnames=reader.fieldnames, delimiter=",")
writer.writeheader()
for row in reader:
if row == 'Canada':
writer.writerow(row)
但是這段代碼不起作用,我收到了錯誤
錯誤:字段大於字段限制 (131072)
我知道問題是在 Python 中尋求解決方案,但我相信使用命令行工具可以更輕松地解決此任務。
使用 Bash 的單線:
grep 'canada' myFile.csv > outputfile.csv
即使沒有 csv 模塊,您也可以做到這一點。
# read file and split by newlines (get list of rows)
with open('input.csv', 'r') as f:
rows = f.read().split('\n')
# loop over rows and append to list if they contain 'canada'
rows_containing_keyword = [row for row in rows if 'canada' in row]
# create and write lines to output file
with open('output.csv', 'w+') as f:
f.write('\n'.join(rows_containing_keyword))
假設您的 .csv 數據 ( twitter-1.csv
) 如下所示:
tweets,date,area
dbcjhbc,12:4:19,us
cbhjc,3:3:18,germany
cwecewc,5:6:19,canada
cwec,23:4:19,us
wncwjwk,9:8:18,canada
使用 numpy:
import numpy as np
# import .csv data (skipping header)
data = np.genfromtxt('twitter-1.csv', delimiter=',', dtype='string', skip_header=1)
# select only rows where the 'area' column is 'canada'
data_canada = data[np.where(data[:,2]=='canada')]
# export the resulting data
np.savetxt("foo.csv", data_canada, delimiter=',', fmt='%s')
foo.csv
將包含:
cwecewc,5:6:19,canada
wncwjwk,9:8:18,canada
如果您想搜索canada
每個條目(每列),那么您可以使用列表理解。 假設twitter-1.csv
在tweets
列中包含一個canada
的出現:
tweets,date,area
dbcjhbc,12:4:19,us
cbhjc,3:3:18,germany
cwecewc,5:6:19,canada
canada,23:4:19,us
wncwjwk,9:8:18,canada
這將返回任何出現canada
所有行:
out = [i for i, v in enumerate(data) if 'canada' in v]
data_canada = data[out]
np.savetxt("foo.csv", data_canada, delimiter=',', fmt='%s')
現在, foo.csv
將包含:
cwecewc,5:6:19,canada
canada,23:4:19,us
wncwjwk,9:8:18,canada
除了grep
之外的所有解決方案(如果grep
可用,這可能是最快的)將整個 .csv 文件加載到內存中。 不要那樣做! 您可以流式傳輸文件並一次僅在內存中保留一行。
with open('input.csv', 'r') as if, open('output.csv', 'w') as of:
for line in if:
if 'canada' in line:
of.write(line)
注意:我實際上在這台計算機上沒有 python3,所以這段代碼可能有錯字。 但是我相信它在足夠大的文件上比在操作之前將整個文件加載到內存中更有效。 看到基准測試會很有趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.