gpt4 book ai didi

python - 将可变数量的 csv 文件中的一列合并到一个 csv 文件中

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:52 25 4
gpt4 key购买 nike

这里是Python新手程序员。我知道有很多与此相关的帖子,但我审查过的解决方案似乎都不适合我的问题。

我有数量不定的 csv 文件,它们的列数都相同。第四列的标题将随每个 csv 文件而变化(它是儒略日期)。顺便说一句,第四列存储来自卫星传感器的表面温度。举个例子:

UID,Latitude,Longitude,001
1,-151.01,45.20,13121
2,-151.13,45.16,15009
3,-151.02,45.09,10067
4,-151.33,45.03,14010

我想保留前四列(最好是文件列表中的第一个 csv 文件),然后将所有剩余 csv 文件中的第四列加入/合并到第一个表中。最终的表格将如下所示:

UID,Latitude,Longitude,001,007,015,023,...
1,-151.01,45.20,13121,13129,13340,12995
2,-151.13,45.16,15009,15001,14997,15103
3,-151.02,45.09,10067,11036,10074,10921
4,-151.33,45.03,14010,14005,14102,14339

我知道 Pandas 包可能是一种更简单的方法,但我不想在此工具中需要第三方包(要求用户使用 easy_install、PIP 等)。我还意识到这在 RDBMS 中会简单得多,但同样,我不希望这成为一个要求。所以我只使用 csv 模块。

我想我明白如何做到这一点,并且我假设我应该将合并的行写入新的 csv 文件。我已经从第一个 csv 文件中提取标题,然后循环遍历每个后续 csv 文件以将新的列名称添加到标题行。我遇到的问题是,除了第一个 csv 文件中的行之外,如何仅写入第四列中的值。所有 csv 文件都有 UID 列,它们应该匹配。

def build_table(acq_date_list, mosaic_io_array, input_dir, dir_list):
acq_year = mosaic_io_array[0][0]
out_dir = '%s\\%s\\' % (input_dir, dir_list[1])
out_file = '%s%s_%s.%s' % (out_dir, 'LST_final', acq_year, 'csv')
# get first csv file in the list of files
first_file = acq_date_list[0][1]
# open and read the first csv file
with open(first_file, 'rb') as first_csv:
r1 = csv.reader(first_csv, delimeter = ',')
header1 = next(r1)
allrows1 = []
row1 = next(r1)
allrows1.append(row1)
# open and write to the new csv
with open(out_file, 'wb') as out_csv:
w = csv.writer(out_csv, delimeter = ',')
# loop through the list of remaining csv files
for acq_date in acq_date_list[1:]: # skip the first csv file
# open and read other csv files
with open(acq_date[1], 'rb') as other_csv:
rX = csv.reader(other_csv, delimeter = ',')
headerX = next(rX)
header_row = '%s,%s' % (header1, headerX)

# write header and subsequent merged rows to new csv file?

也许之后:

headerX = next(rX)

我可以将标题行拆分为一个列表,然后取出第四项?这也适用于“其他”csv 文件中的剩余行吗?或者这通常是错误的方法?

2016 年 2 月 26 日更新实际上我只得到了 Gijs 的解决方案来部分工作。标题列会迭代添加,但不会添加行中的其余值。我仍然不确定如何使用剩余 csv 文件中的值填充空单元格。

Latitude,001,UID,Longitude,009,017,025,033,041
795670.198,13506,0,-1717516.429,,,,,
795670.198,13173,1,-1716125.286,,,,,
795670.198,13502,2,-1714734.143,,,,,

最佳答案

循环遍历文件,跟踪存在哪些键并使用 csv.DictWriter 和 csv.DictReader 写入所有记录。

import csv

records = list()
all_keys = set()
for fn in ["table_1.csv", "table_2.csv"]:
with open(fn) as f:
reader = csv.DictReader(f)
all_keys.update(set(reader.fieldnames))
for r in reader:
records.append(r)

with open("table_merged.csv", "wb") as f:
writer = csv.DictWriter(f, fieldnames = all_keys)
writer.writeheader()
for r in records:
writer.writerow(r)

这将为没有该列的记录写入一个空的“单元格”。

将您的文件作为第一个和第二个 .csv,在第二种情况下,最后一列重命名为 002 而不是 001 >,你会得到这个:

UID,Longitude,002,001,Latitude
1,45.20,,13121,-151.01
2,45.16,,15009,-151.13
3,45.09,,10067,-151.02
4,45.03,,14010,-151.33
1,45.20,13121,,-151.01
2,45.16,15009,,-151.13
3,45.09,10067,,-151.02
4,45.03,14010,,-151.33

如果您希望按特定顺序保留列,则必须将 all_keys 设为 list,然后仅在新文件中添加以下列:不在 all_keys 中。

all_keys = list()

...
all_keys += list(set(reader.fieldnames).difference(set(all_keys)))

关于python - 将可变数量的 csv 文件中的一列合并到一个 csv 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35611976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com