python从两个csv文件中取出列并将它们组合成一个新的csv文件

时间:2014-09-18 13:43:09

标签: python

我试图从两个csv文件中提取列,并将所有选定的列放在一个新的csv文件中。 这是我原来的csv文件:

文件1:

Date    Time    FromPool:1:Delta    ToPool:1:Delta  FromPool:2:Kentucky ToPool:2:Kentucky   FromPool:3:MISO ToPool:3:MISO   FromPool:4:MRO  ToPool:4:MRO    FromPool:5:NC-SC    ToPool:5:NC-SC  FromPool:6:NY   ToPool:6:NY FromPool:7:PJM  ToPool:7:PJM    FromPool:8:TVA  ToPool:8:TVA
20181231    1   0   0   0   0   0   0   0   0   0   0   0   1470.82 1470.82 0   0   0
20181231    2   0   0   0   0   0   0   0   0   0   0   0   1475.41 1475.41 0   0   0
20181231    3   0   0   0   0   0   0   0   0   0   0   0   1480    1480    0   0   0
20181231    4   0   27.968  0   0   27.968  0   0   0   0   0   0   1480    1480    0   0   0
20181231    5   0   96.0939 0   0   117.8839    0   0   21.79   0   0   0   1331.068    1331.068    0   0   0
20181231    6   0   134.389 0   0   358.959 0   0   224.57  0   176.872 0   1464.9179   1464.9179   0   176.872 0
20181231    7   0   291.438 30.664  0   680.182 0   0   388.744 0   1404.892    0   1437.115    1437.115    30.664  1404.892    0
20181231    8   0   89.73   0   188.531 2404.063    0   0   388.742 0   1651.703    0   1410.229    1410.229    1737.06 1651.703    0
20181231    9   0   69.205  0   5.173   1419.352    0   0   388.743 0   1229.549    0   1398.427    1398.427    956.231 1229.549    0
20181231    10  0   0   112.367 0   1146.827    0   0   388.744 0   499.606 0   1393.049    1393.049    870.45  499.606 0
20181231    11  0   0   175.866 0   658.502 0   0   388.743 0   595.023 0   1391.607    1391.607    445.625 595.023 0
20181231    12  0   0   253.185 0   388.743 0   0   388.743 0   0   0   1393.049    1393.049    253.185 0   0
20181231    13  33.122  0   331.169 0   388.743 33.122  0   388.743 0   0   0   1396.984    1396.984    331.169 0   0
20181231    14  138.976 0   428.169 0   388.743 138.976 0   388.743 0   0   0   1398.426    1398.426    428.169 0   0
20181231    15  138.513 0   519.169 0   602.173 138.513 0   388.744 0   0   0   1401.049    1401.049    732.598 0   0
20181231    16  236.296 0   601.169 0   388.743 236.296 0   388.743 0   0   0   1399.738    1399.738    601.169 0   0
20181231    17  232.315 0   608.169 0   351.52  232.315 0   351.52  0   0   0   1386.229    1386.229    608.169 0   0
20181231    18  151.122 0   520.651 0   0   257.159 0   0   0   22.9259 0   1361.311    1467.348    520.651 22.9259 0
20181231    19  455.448 0   404.21  0   0   455.448 0   0   0   709.279 0   943.671 943.671 404.21  709.279 0
20181231    20  365.492 0   381.21  0   0   503.266 0   0   0   1334.21 0   1355.392    1493.166    381.21  1334.21 0
20181231    21  257.002 0   298.71  0   225.526 257.002 0   225.526 0   1350.388    0   1376.656    1376.656    298.71  1350.388    0
20181231    22  332.8759    0   341.169 0   388.743 332.8759    0   388.743 0   779.539 0   1393.049    1393.049    341.169 779.539 0
20181231    23  0   12.976  0   0   97.5    0   0   84.524  0   0   0   1419.278    1419.278    0   0   0
20181231    24  0   0   0   0   0   0   0   0   0   0   0   1445.6389   1445.6389   0   0   0
20190101    1   0   0   0   0   0   0   0   0   0   0   0   1338.195    1338.195    0   0   0
20190101    2   0   0   0   0   0   0   0   0   0   0   0   1213.715    1213.715    0   0   0

文件2:

Date    Time    PJM_G($/MWH)    PJM_H($/MWH)
20181231    1   28.549  28.923
20181231    2   27.262  29.067
20181231    3   27.839  29.524
20181231    4   28.136  30.132
20181231    5   30.339  33.152
20181231    6   32.511  35.47
20181231    7   38.585  40.438
20181231    8   39.514  41.878
20181231    9   38.843  41.401
20181231    10  38.447  40.631
20181231    11  38.3    40.393
20181231    12  37.496  39.631
20181231    13  37.529  39.598
20181231    14  38.072  40.001
20181231    15  38.202  40.135
20181231    16  37.641  39.577
20181231    17  38.37   40.276
20181231    18  45.857  48.009
20181231    19  55.744  58.435
20181231    20  47.055  49.369
20181231    21  39.962  42.045
20181231    22  37.961  40.164
20181231    23  32.169  34.892
20181231    24  26.309  27.747
20190101    1   27.407  28.779
20190101    2   27.672  28.959

这是我的代码,我只是不明白为什么我无法得到我想要的正确结果。

import csv
processyear = 2019
f_r1 = open("Pool_to_Pool_Tariffs.csv")
f_r2 = open("PJM_LMP.csv")
f_w = open("Economic_interchange_process.csv","w")
f1 = csv.reader(f_r1)
f2 = csv.reader(f_r2)
next(f1)
next(f2)

for line1 in f1:
    for line2 in f2:
        if (line1[0].strip() == line2[0].strip()):
            if (line1[1].strip() == line2[1].strip()):
                if int(line2[0][:4]) == processyear:
                    f_w.write(line2[0]+','+line2[1]+','+line1[14]+','+line1[15]+','+line2[2]+','+line2[3]+'\n')
f_r1.close()
f_r2.close()
f_w.close()
希望你能帮助我。

2 个答案:

答案 0 :(得分:1)

你有几个问题:

首先,您的文件不是CSV,而是以制表符分隔。所以这些行需要改变:

f1 = csv.reader(f_r1, delimiter='\t')
f2 = csv.reader(f_r2, delimiter='\t')

其次,您只能读取这些CSV文件一次,读取器对象会占用该文件,并且不会将整个文件存储在数组中。所以这个循环:

for line1 in f1:
    for line2 in f2:

这样做是读取f1的第一行。然后消耗f2的 ALL 。当您在f1上第二次循环时,f2已经为空,因此您无法获得预期的结果。

这是一个如何消耗它的演示:

>>> f1 = csv.reader(open("Pool_to_Pool_Tariffs.csv"), delimiter='\t')
>>> x = 0
>>> for line in f1:  x = x + 1
... 
>>> print x
27
>>> x = 0
>>> for line in f1: x = x + 1
... 
>>> x
0

请注意,我运行了一次for循环,我的文件有27行。我重置x,再次运行文件,我有0行。这是为什么?这是因为f1位于文件的末尾,没有其他内容可供阅读。

您应该使用不同的方法重写它。一种选择是将两个文件读入数据结构(如字典),然后比较字典。另一种方法是将两者放在一个数据库中,然后使用SQL来加入它们。基本上你要做的是python代码中的关系连接。这对于非常小的简单文件来说没问题,但是如果你打算重复使用它或者重复这样做,你最好使用数据库来做这件事。

答案 1 :(得分:0)

您的代码正在做的是过滤掉过程年份为2019年的所有行,并且只将这些行写入输出文件。

如果是这种情况 - 那么只需从您感兴趣的第一个文件中读取这些行,就可以简化您的生活。

你必须先阅读整个文件,你不能同时阅读它们(你可以,但你每次都必须倒回第二个文件)。

序列如下:

  1. 完全阅读第一个文件,只收集您感兴趣的行(具有目标年份的行)。
  2. 阅读第二个文件,然后:
    1. 如果第二个文件中的年份与第一个文件中的任何行匹配,则
    2. 使用以下字段构建新行:
      1. 第二个文件的匹配行
      2. 中的第一列
      3. 第二个文件的匹配行
      4. 中的第二列
      5. 第一个文件的匹配行的第15列
      6. 第一个文件的匹配行
      7. 中的第16列
      8. 来自第二个文件的匹配行的第3列
      9. 第二个文件的匹配行
      10. 中的第4列
    3. 将新行写入单独的文件
  3. 以下是一些实现该逻辑的代码:

    import csv
    from collections import defaultdict
    
    YEAR = '2019'
    
    file_a = 'Pool_to_Pool_Tariffs.csv'
    file_b = 'PJM_LMP.csv'
    result = 'Economic_interchange_process.csv'
    
    source_lines = defaultdict(list)
    
    with open(file_a, 'r') as f:
       reader = csv.reader(f, delimiter='\t')
       next(reader) # skips the header
       for row in reader:
           if row[0][:4] == YEAR:
              source_lines[row[0]].append(row)
    
    with open(file_b, 'r') as f, open(result, 'w') as o:
       reader = csv.reader(f, delimiter='\t')
       writer = csv.writer(o, delimiter=',')
       next(reader)
       for row in reader:
          matched_row = source_lines.get(row[0])
          if matched_row:
             # We found a year that matches
             result_row = (row[0], row[1], matched_row[14], matched_row[15], row[2], row[3]) 
             writer.writerow(result_row)