我试图从两个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()
希望你能帮助我。
答案 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年的所有行,并且只将这些行写入输出文件。
如果是这种情况 - 那么只需从您感兴趣的第一个文件中读取这些行,就可以简化您的生活。
你必须先阅读整个文件,你不能同时阅读它们(你可以,但你每次都必须倒回第二个文件)。
序列如下:
以下是一些实现该逻辑的代码:
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)