0

複数のディレクトリにcsvファイルが分散しています。各csvファイルには、データを含む列が1つしかありません。私がやりたいことは、これらすべてのファイルを読み取り、各ファイルの列を csv ファイルに取り込むことです。最終的なcsvファイルには、ヘッダーとしてファイル名を持つ列があり、列データとして元のファイルからのそれぞれのデータがあります。

これは内部の私のディレクトリ構造です~/csv_files/ ls

ab   arc  bat-smg   bn       cdo  crh      diq  es   fo   gd   haw  ia   iu   ki   ksh  lez  lv   mo   na      no   os   pih  rmy   sah  simple  ss   tet  tr   ur   war  zea
ace  arz  bcl       bo       ce   cs       dsb  et   fr   gl   he   id   ja   kk   ku   lg   map-bms  mr   nah     nov  pa   pl   rn    sc   sk      st   tg   ts   uz   wo   zh
af   as

各ディレクトリには 2 つの csv ファイルがあり、os.walk() 関数を使用することを考えましたが、os.walk の理解が間違っていると思います。そのため、現在私が持っているものは何も生成しません。

import sys, os
import csv

root_path = os.path.expanduser(
    '~/data/missing_files')

def combine_csv_files(path):
    for root, dirs, files in os.walk(path):
        for dir in dirs:
            for name in files:
                if name.endswith(".csv"):
                    csv_path = os.path.expanduser(root_path + name)
                    if os.path.exists(csv_path):
                        try:
                            with open(csv_path, 'rb') as f:
                                t = f.read().splitlines()
                                print t
                        except IOError, e:
                            print e

def main():
    combine_csv_files(root_path)

if __name__=="__main__":
    main()

私の質問は次のとおりです。

  1. ここで何が間違っていますか?
  2. 別のファイルから 1 つの csv 列を読み取って、そのデータを列として別のファイルに追加できますか。これは、csv ファイルは行に依存しており、ここでは行間に依存関係がないためです。

最後に、このようなcsvファイルを取得しようとしています(ここに潜在的なヘッダーがあります)

ab_csv_data_file1, ab_csv_data_file2, arc_csv_data_file1, arc_csv_data_file2
4

2 に答える 2

2

os.walk() を間違って使用しています

def combine_csv_files(path):
    for root, dirs, files in os.walk(path):
        for name in files:
            if name.endswith(".csv"):
                csv_path = os.path.join(root, name)
                try:
                    with open(csv_path, 'rb') as f:
                        t = f.read().splitlines()
                        print t
                except IOError, e:
                    print e

os.walk() 関数は、3 つのタプル (dirpath、dirnames、filenames) を生成します。「dirpath」は現在歩いているディレクトリのパス、「dirnames」は「dirpath」内のディレクトリのリスト、「filenames」は「dirpath」内のファイルのリストです。「dirpath」は、ここでの「パス」であり、「パス」のサブフォルダーである可能性があります。

于 2013-04-16T21:30:54.733 に答える
1

I don't know whether I understand what you mean. Let's you have multiple folders, such as "ab", "arc" and so on. For each folder, it contains two CSV files.

If I am right, then you are not doing the right thing.

def combine_csv_files(path):
    for root, dirs, files in os.walk(path):
        for dir in dirs:
            for dirpath, sub_dirs, sub_files in os.walk('/'.join([path,dir])
                for name in sub_files:
                    if name.endswith(".csv"):
                        csv_path = os.path.expanduser(dirpath + name)
                        if os.path.exists(csv_path):
                            try:
                                with open(csv_path, 'rb') as f:
                                    t = f.read().splitlines()
                                    print t
                            except IOError, e:
                                print e

The above code should works, if I am right

于 2013-04-16T21:40:25.680 に答える