簡體   English   中英

如何使用python將包含特定單詞的整行excel(.csv)復制到另一個csv文件中?

[英]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.csvtweets列中包含一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM