2017-09-17 8 views
0

にzip形式のCSVファイルを連結し、私のpython 3のコードです:Pythonの3.Xここ1、非圧縮csvファイル

import zipfile 
import os 
import time 
from timeit import default_timer as timer 
import re 
import glob 
import pandas as pd 


# local variabless 
# pc version 
# the_dir = r'c:\ImpExpData' 
# linux version 
the_dir = '/home/ralph/Documents/lulumcusb/ImpExpData/Exports/92-95' 


def main(): 
    """ 
    this is the function that controls the processing 
    """ 
    start_time = timer() 
    for root, dirs, files in os.walk(the_dir): 
     for file in files: 
      if file.endswith(".zip"): 
       print("working dir is ...", the_dir) 
       zipPath = os.path.join(root, file) 
       z = zipfile.ZipFile(zipPath, "r") 
       for filename in z.namelist(): 
        if filename.endswith(".csv"): 
         # print filename 
         if re.match(r'^Trade-Geo.*\.csv$', filename): 
          pass # do somethin with geo file 
         # print " Geo data: " , filename 
         elif re.match(r'^Trade-Metadata.*\.csv$', filename): 
          pass # do something with metadata file 
         # print "Metadata: ", filename 
         else: 
          try: 
           with zipfile.ZipFile(zipPath) as z: 
            with z.open(filename) as f: 
             # print("send to test def...", filename) 
             # print(zipPath) 
             with zipfile.ZipFile(zipPath) as z: 
              with z.open(filename) as f: 
               frame = pd.DataFrame() 
               # EmptyDataError: No columns to parse from file -- how to deal with this error 
               train_df = read_csv(f, index_col=None, header=0, skiprows=1, encoding="cp1252") 
               # train_df = pd.read_csv(f, header=0, skiprows=1, delimiter=",", encoding="cp1252") 
               list_ = [] 
               list_.append(train_df) 
               # print(list_) 
               frame = pd.concat(list_, ignore_index=True) 
               frame.to_csv('/home/ralph/Documents/lulumcusb/ImpExpData/Exports/concat_test.csv', encoding='cp1252') # works 
          except: # catches EmptyDataError: No columns to parse from file 
           print("EmptyDataError...." ,filename, "...", zipPath) 

# GetSubDirList(the_dir) 
    end_time = timer() 
    print("Elapsed time was %g seconds" % (end_time - start_time)) 


if __name__ == '__main__': 
    main() 

それは主に動作します - それだけを1つに、すべてのzip形式のCSVファイルを連結しません。 1つの空のファイルがあり、すべてのcsvファイルは同じ行構造のすべてのcsvファイルを持つフィールド構造を持ちます。私はそれを実行したときに、ここで

は何スパイダーレポートです:

runfile('/home/ralph/Documents/lulumcusb/Sep15_cocncatCSV.py', wdir='/home/ralph/Documents/lulumcusb') 

working dir is ... /home/ralph/Documents/lulumcusb/ImpExpData/Exports/92-95 

EmptyDataError.... Trade-Exports-Chp-77.csv ... /home/ralph/Documents/lulumcusb/ImpExpData/Exports/92-95/Trade-Exports-Yr1992-1995.zip 

/home/ralph/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py:688: DtypeWarning: Columns (1) have mixed types. Specify dtype option on import or set low_memory=False. 
    execfile(filename, namespace) 

Elapsed time was 104.857 seconds 

最終たcsvfileが処理された最後のzip形式のcsvファイルです。サイズはcsvファイルの変更、それはファイルを処理として

フィールドまたは列名がある

私は1つは、非圧縮CSVファイルにCONCATしたい圧縮ファイルで99件のCSVファイルがあります。 colmNamesは=

csvfilesにはラベルが付けられています:chp01.csv、["hs_code"、 "uom"、 "country"、 "prov"、 "value"、 "quatity" cht02.csvなどをchp99.csvに追加し、 "uom"(測定単位)を空にするか、hs_codeに応じて整数または文字列にします

質問:どのようにzip形式のc svファイルを1つの大きな(推定100 MBの圧縮されていない)csvファイルに連結するには?

追加の詳細: 私はcsvファイルを解凍しないようにしていますが、削除する必要があります。私はファイルを連結する必要があるため、私は追加の処理を行う必要があります。圧縮されたCSVファイルの解凍は実行可能なオプションです。私はそれをする必要はないと思っていました。

答えて

0

シェルでこれをしたくない理由はありますか?

cd "/home/ralph/Documents/lulumcusb/ImpExpData/Exports/92-95" 
unzip "Trade-Exports-Yr1992-1995.zip" -d unzipped && cd unzipped 
for f in Trade-Exports-Chp*.csv; do tail --lines=+2 "$f" >> concat.csv; done 

これはconcat.csvに追加する前に、各CSVファイルから最初の行(列名)を削除します。あなたは無関係である連結順序を仮定し

あなただけやった場合:、あなたが順序を気にした場合

==> Trade-Exports-Chp-1.csv <== 
... 

==> Trade-Exports-Chp-10.csv <== 
... 

==> Trade-Exports-Chp-2.csv <== 
... 

etc. 

Trade-Exports-Chp-01.csv .. Trade-Exports-Chp-09.csvTrade-Exports-Chp-1.csv .. Trade-Exports-Chp-9.csvを変更します。

tail --lines=+2 "Trade-Exports-Chp*.csv" > concat.csv 

あなたはで終わるだろう。

これはPythonで実行可能ですが、私はそれがこの場合の仕事にとって適切なツールではないと思います。


あなたが実際にzipファイルを解凍することなく、代わりに仕事をしたい場合:

for i in {1..99}; do 
    unzip -p "Trade-Exports-Yr1992-1995.zip" "Trade-Exports-Chp$i.csv" | tail --lines=+2 >> concat.csv 
done 
+0

[OK]を、私は、供給されたシェルスクリプトが動作するようになりました。私が同じことをPythonでやりたければ、どうすればいいですか?他のstackoverflowアイテムはpandas concatに続いてpandas to_csvルートが動作することを示唆していますが、それは私のためではありません。私が逃した何かがありますか? – rspaans

関連する問題