1

24 列の約 30,000 行のデータを含む CSV ファイルがあります。最後の列は地理的な列で、次のようになります。

 Ethiopia
 IL
 IL
 TX
 TX
 MD
 NY
 NY
 Ethiopia
 Ethiopia
 Sweden
 CA
 CA
 HI
 Latvia
 OH

今のところ、すべての行を含む CSV 全体が、2 文字の州の略語 (CA、HI、OH など) である米国の地理的な場所に対応するようにしたいだけです。

基本的に、CSV 内のすべてのデータから、米国に関連しないものをすべて削除するか、可能であれば、最初の X 行を米国に拠点を置く場所ごとに配置し、残りを CSV の最後にあるすべてのものに配置したいと考えています。

これまでの私のコードは次のとおりです。

import csv

ask = "Y"

while ask != "N":
    inputfile = input("Please enter filename: ")
    filename = open(inputfile, "r")

    data = []
    with filename as f:
        reader = csv.reader(f, delimiter=',')
        for row in reader:
            if len(row[24]) == 3:
                data = row[24]
        datalist = row[0:23].join(data)
        output = open("Newly Created Data.csv","w")
        output.write(datalist)
        print ("Done.")

    output.close()

    ask = input("Another file, Y or N? ")

米国の場所のみを読み取ることで、列 24 のデータを正しく配置しますが、残りのファイルと他の 23 列を並べ替えて、米国の場所のみと一致させる方法がわかりません。

私はPython 3を使用しています、ありがとう。

4

2 に答える 2

0
import csv
states = set(["AL","AK","AZ","AR","CA","CO","CT","DE","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA","ME","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY",])

with open('file.txt') as f, open('ofile.txt','w+') as o:
    reader = csv.reader(f)
    writer = csv.writer(o)
    writer.writerows(sorted(reader,key=lambda row: not row[-1] in states))

次のようにファイルをソートします

A,B,C,Ethiopia
A,B,C,IL
A,B,C,IL
A,B,C,TX
A,B,C,TX
A,B,C,MD
A,B,C,NY
A,B,C,NY
A,B,C,Ethiopia
A,B,C,Ethiopia
A,B,C,Sweden
A,B,C,CA
A,B,C,CA
A,B,C,HI
A,B,C,Latvia
A,B,C,OH

の中へ

A,B,C,IL

A,B,C,IL

A,B,C,TX

A,B,C,TX

A,B,C,MD

A,B,C,NY

A,B,C,NY

A,B,C,CA

A,B,C,CA

A,B,C,HI

A,B,C,OH

A,B,C,Ethiopia

A,B,C,Ethiopia

A,B,C,Ethiopia

A,B,C,Sweden

A,B,C,Latvia

次のように読み返すと、次のようになります。

with open('ofile.txt') as f:
    for line in csv.reader(f):
        print(line)

プロデュース:

>>> 
['A', 'B', 'C', 'IL']
['A', 'B', 'C', 'IL']
['A', 'B', 'C', 'TX']
['A', 'B', 'C', 'TX']
['A', 'B', 'C', 'MD']
['A', 'B', 'C', 'NY']
['A', 'B', 'C', 'NY']
['A', 'B', 'C', 'CA']
['A', 'B', 'C', 'CA']
['A', 'B', 'C', 'HI']
['A', 'B', 'C', 'OH']
['A', 'B', 'C', 'Ethiopia']
['A', 'B', 'C', 'Ethiopia']
['A', 'B', 'C', 'Ethiopia']
['A', 'B', 'C', 'Sweden']
['A', 'B', 'C', 'Latvia']
于 2013-05-19T03:52:05.923 に答える
0

純粋に標準的なライブラリソリューションの場合、おそらく次のようなものです

import csv

with open('location.csv', newline='') as fp_in:
    reader = csv.reader(fp_in, delimiter=',')
    data = list(reader)

data.sort(key=lambda x: (len(x[-1].strip()) != 2, x[-1].strip()))

with open("locout.csv", "w", newline='') as fp_out:
    writer = csv.writer(fp_out, delimiter=',')
    writer.writerows(data)

ソート キー関数 はlambda x: (len(x[-1].strip()) != 2, x[-1].strip()))、最初に最後の列が 2 文字かどうかでデータをソートし、最初に 2 文字の位置を配置し、次に名前でソートすることを意味します (少なくともそれらがすべて大文字で始めてください。)

ファイルが大きすぎないことを前提としています。24 列であっても、30000 行はそれほど多くないため、完全にメモリ内で作業することもできます。

(余談ですが、CSV 操作を頻繁に行っている場合は、 pandasライブラリに興味があるかもしれません。これにより、多くの操作が他の方法よりもはるかに簡単になります。)

于 2013-05-19T04:22:23.707 に答える