

ファイル内に格納された複数のCSVファイルについてPandasモジュールを使わずに  
列方向に結合して1つのCSVファイルとして出力したい．  
[![CSVファイルの中身はこのような2列のデータから構成されています．

](https://i.stack.imgur.com/csjEq.png)](https://i.stack.imgur.com/csjEq.png)[![ファイル内にはこのように複数のCSVファイルが格納されています](https://i.stack.imgur.com/H6XrP.png)](https://i.stack.imgur.com/H6XrP.png)


CC BY-SA 4.0
2023-04-09T07:27:35.680
94455
2023-04-12T14:31:36.400
2023-04-09T07:28:34.267
57861
57861
question
python
PythonでPandasを使わずにファイル内の複数のCSVファイルを列方向に結合する方法を知りたい


コメントで御指摘のとおり条件が曖昧なので御参考になりますが，「入力ファイルの文字は ASCII
のみ，入力ファイルの行数が異なる場合は最も少ないファイルに揃えて結合（余り行は切り捨て），出力ファイルの改行コードは環境依存（Win: CRLF,
macOS/Linux: LF）」で記述例を示します。

[code]

    files = ['Run01.csv', 'Run02.csv', 'Run03.csv']
    result_file = 'Run.csv'
    
    n_file = len(files)
    data = []
    for i in range(n_file):
        with open(files[i], 'r') as f:
            data.append(f.read().splitlines())
    
    n_line = min([len(data[i]) for i in range(n_file)])
    
    result = []
    for j in range(n_line):
        result.append(','.join([data[i][j] for i in range(n_file)]) + '\n')
    
    with open(result_file, 'w') as f:
        f.writelines(result)
    
[/code]

なお， （[RFC 4180](https://tools.ietf.org/html/rfc4180) に準拠して）macOS/Linux
環境でも改行コードを CRLF にするには最後の `open()` に `newline='\r\n'` を追加してください。


CC BY-SA 4.0
2023-04-11T11:22:43.083
94488
2023-04-11T11:22:43.083
54588
94455
answer


おそらく質問の雰囲気的に以下のような形式のCSVファイルにしたいのではないでしょうか？  
`time [s]`の列は左端に1つだけ存在して、各CSVファイルの2列目がその右側に順々に並んで増えていく形だと思われます。

time [s] | dm2@hrpipeinput1_2_Run1 | dm2@hrpipeinput1_2_Run2 |
dm2@hrpipeinput1_2_Run3  
---|---|---|---  
0 | 0.751883 | 0.851883 | 0.951883  
0.01 | 0.127555 | 0.227555 | 0.327555  
0.02 | 0.127819 | 0.227819 | 0.327819  
0.03 | 0.127843 | 0.227843 | 0.327843  
0.04 | 0.127845 | 0.227845 | 0.327845  
  
その場合は以下のようなスクリプトで変換できるでしょう。

[code]

    import csv
    import glob
    import os
    
    f_dir = './'
    f_name = 'Run??.csv' #### 元のCSVファイル群のワイルドカード表現
    out_f_name = 'Result.csv' #### 結果出力ファイル名：上記と衝突しない形式
    
    #### 該当フォルダのCSVファイルを列挙して読み込み、
    #### time [s]の列をキー、2列目を値とする辞書のリストとして作成
    #### 1つのCSVファイルを1つの辞書とし、各ファイルをリストの1行として扱う
    #### 全てのCSVファイルは同じ行数で同じtime [s]が揃っていると仮定
    dictlist = []
    for fpath in sorted(glob.glob(os.path.join(f_dir, f_name))):
        dictlist.append(dict(list(csv.reader(open(fpath, newline='')))))
    
    #### データ数が不揃いだとかtime [s]の列の値が飛んだり重複したり等があるなら
    #### この段階で調整して行・桁の数を揃えたデータを作成する処理を挿入する
    
    #### 辞書のリストをヘッダー付きの値の2次元リストに変換
    valuelist = [list(dictlist[0].keys())] #### 辞書のキーをヘッダー行として抽出
    valuelist.extend([list(d.values()) for d in dictlist]) #### 値を2次元リスト化
    
    #### 2次元リストの行と列を転換する
    result = list(map(list, zip(*valuelist)))
    
    #### 結果をCSVファイルとして書き出し
    with open(out_f_name, 'w', newline='') as f:
       writer = csv.writer(f)
       writer.writerows(result)
    
[/code]

* * *

あるいは @Delft View さん回答のように元のCSVファイルのデータをすべて活かして結合するなら、こちらのスクリプトになります。

[code]

    import csv
    import glob
    import os
    
    f_dir = './'
    f_name = 'Run??.csv' #### 元のCSVファイル群のワイルドカード表現
    out_f_name = 'Result.csv' #### 結果出力ファイル名：上記と衝突しない形式
    
    #### 該当フォルダのCSVファイルを列挙して読み込み、
    #### すべてのCSVファイルのデータを活かして、各列を行データとして追記していく
    worklist = []
    for fpath in sorted(glob.glob(os.path.join(f_dir, f_name))):
        worklist.extend(list(map(list, zip(*list(csv.reader(open(fpath, newline='')))))))
    
    #### データ数の不揃い等があるなら
    #### この段階で調整して行・桁の数を揃えたデータを作成する処理を挿入する
    #### 以下は一番大きい行数のファイルに合わせる形の処理
    max_count = max([len(i) for i in worklist])
    valuelist = []
    for row in worklist:
        count = max_count - len(row) #### データ数が最大より小さいか判定用
        if count:
            row += [None for x in range(count)] #### 小さいなら残りにはNoneを追加
        valuelist.append(row)
    
    #### 2次元リストの行と列を転換する
    result = list(map(list, zip(*valuelist)))
    
    #### 結果をCSVファイルとして書き出し
    with open(out_f_name, 'w', newline='') as f:
       writer = csv.writer(f)
       writer.writerows(result)
    
[/code]


CC BY-SA 4.0
2023-04-12T04:49:10.493
94496
2023-04-12T14:31:36.400
2023-04-12T14:31:36.400
26370
26370
94455
answer