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

2024-05-03 16:30:59 发布

您现在位置: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:

^{pr2}$

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

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()

希望你能帮助我。在


Tags: 文件csvcloseifopenf2f1strip
2条回答

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

如果是这样的话,那么你可以简化你的生活,只需从你感兴趣的第一个文件中读取这些行。在

你必须先读整个文件,你不能一步一步地读这两个文件(当然你可以,但是你每次都要倒回第二个文件)。在

顺序如下:

  1. 完全阅读第一个文件,只收集您感兴趣的行(目标年份的行)。在
  2. 阅读第二个文件,然后:
    1. 如果第二个文件中的年份与第一个文件中的任何行匹配
    2. 使用以下字段构造新行:
      1. 第二个文件匹配行的第一列
      2. 第二个文件匹配行的第二列
      3. 第一个文件匹配行的第15列
      4. 第一个文件匹配行的第16列
      5. 第二个文件匹配行的第三列
      6. 第二个文件匹配行的第4列
    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)

你在这里遇到了几个问题:

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

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

第二,你只能读取这些CSV文件一次,reader对象会消耗该文件,而不会将整个内容存储在数组中。所以这个循环:

^{pr2}$

它的作用是读取f1的第一行。然后它会消耗所有的f2。当你在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代码中的关系连接。对于非常小的简单文件来说,这是可以的,但是如果您打算重用它或重复使用它,那么最好使用数据库来完成这项工作。在

相关问题 更多 >