Python:读取两个 csv 文件组合成一个新的 cvs 文件,错误:太多值无法解压

Posted

技术标签:

【中文标题】Python:读取两个 csv 文件组合成一个新的 cvs 文件,错误:太多值无法解压【英文标题】:Python: Reading two csv files combining into a new cvs file , error: too many values to unpack 【发布时间】:2016-09-25 04:23:52 【问题描述】:

我正在尝试在 python 2.7 中合并两个数据集。它们处理不同的变量(一个是windspd、winddir,另一个是co2和h2o),但日期和时间匹配。

所有数据都来自两个 csv 文件,我需要将其写入一个新的 csv 文件,但我不断在第三行收到“错误:要解压的值太多”。

我仔细检查了我的变量数量是否与电子表格中的列数量相同。

任何建议都会非常有帮助!附上我目前的代码。

import numpy as np

winddir, windspd, month, day, year, hour, minute=np.loadtxt('E:\Wind05032014_08312015_flag_full.csv', delimiter=',',unpack=True,dtype='str',skiprows=1)
co2m, h2om, day_1, month_1, year_1, hour_1, minute_1=np.loadtxt('E:\CO2_05032014_03182015_flag_full.csv', delimiter=',',unpack=True,dtype='str',skiprows=1)

x=0
y=0

for eachdate in month:
    year_x=float(year[x])
    month_x=float(month[x])
    day_x=float(day[x])
    hour_x=float(hour[x])
    minute_x=float(minute[x])
    year_y=float(year_1[y])
    month_y=float(month_1[y])
    day_y=float(day_1[y])
    hour_y=float(hour_1[y])
    minute_y=float(minute_1[y])
    if (year_x == year_y) and (month_x==month_y) and (day_x==day_y) and (hour_x==hour_y) and (minute_x == minute_y):
        saveline=str(year_x)+','+str(month_x)+','+str(day_x)+','+str(hour_x)+','+str(minute_x)+','+winddir[x]+','+windspd[x]+','+co2m[y]+','+h2om[y]+'\n'
        savefile=open('E:\co2h2owind_05032014_03182015.csv', 'a')
        savefile.write(saveline)
        savefile.close()
        y+=1
    x+=1

【问题讨论】:

【参考方案1】:

np.arrays 首先按行索引。因此,您正在尝试将所有行放入列变量中。 先尝试转置:

winddir, windspd, month, day, year, hour, minute=np.loadtxt('E:\Wind05032014_08312015_flag_full.csv', delimiter=',',unpack=True,dtype='str',skiprows=1).T

使用print your_array.shape 之类的检查可能很有用...

【讨论】:

我对 python 很陌生,我不确定我是否理解你的问题。我有两个电子表格,第一行都标有列,每个电子表格都有 1000 行数据。最后,我想要一个电子表格,其中所有变量都根据日期和时间匹配。 a,b,c = my_array 等价于a = my_array[0]b = my_array[1]c = my_array[2]。但是my_array[i] 是第 i 行,而不是第 i 列。所以如果你先转置你的数组,使用my_array.T,它应该可以正常工作。 谢谢,这很有道理。不幸的是,我刚刚进行了您最初建议的更正,并且收到了同样的错误 @KateMcGowan 所以您正在保存电子表格中的 csv。看看是否可以将电子表格的几行保存到 csv 中。电子表格文件中可能存在数据错误。 尝试分解导致错误的行以隔离问题:首先是my_array = np.loadtxt(...),然后是print my_array.shape。如果您没有收到(n_rows,7),那么您的电子表格就不是您想的那样,您必须仔细检查数据的格式...【参考方案2】:

您可以这样做以找出问题所在:

NUM_COLS = 7
rows = np.loadtxt(...)
print [x for x in rows if len(x) > NUM_COLS]

【讨论】:

【参考方案3】:

将使用 pandas 而不是 numpy 来读取这些 csv。 Pandas 似乎有更多的错误检查功能。 (对于初学者,排列“=”号可以让你的代码更具可读性。

试试这个:

mydata=np.loadtxt('E:\CO2_05032014_03182015_flag_full.csv',delimiter=',',unpack=True,dtype='str',skiprows=1)

print mydata.shape

元组返回是(行,列)

savefile = open('E:\co2h2owind_05032014_03182015.csv', 'ab')  
for eachdate in month:
        year_x   =float(year[x])
        month_x  =float(month[x])
        day_x    =float(day[x])
        hour_x   =float(hour[x])
        minute_x =float(minute[x])

        year_y   =float(year_1[y])
        month_y  =float(month_1[y])
        day_y    =float(day_1[y])
        hour_y   =float(hour_1[y])
        minute_y =float(minute_1[y])

        if (year_x == year_y) and (month_x==month_y) and (day_x==day_y) and (hour_x==hour_y) and (minute_x == minute_y):

                 saveline = str(year_x)+','+str(month_x)+','+str(day_x)+','+str(hour_x)+','+str(minute_x)+','+winddir[x]+','+windspd[x]+','+co2m[y]+','+h2om[y]+'\n'
                 print saveline        
                 savefile.write(saveline)     
                 y+=1

            x+=1
            print x,y  
savefile.close()

【讨论】:

谢谢,我尝试了 print.shape 并在修复电子表格中的错误后能够获得正确的尺寸。但是,当我更改为这个重新格式化的版本时,创建的文件是空白的。 好的,添加一些稍后将被删除的打印语句。我们所做的只是不重复打开和关闭文件。【参考方案4】:

unpacking 错误是左侧变量数与loadtxt 读取的列数不匹配的结果。

左边有 7 个变量。我们不知道您的文件中有多少列。

co2m, h2om, day_1, month_1, year_1, hour_1, minute_1 = 
    np.loadtxt('E:\CO2_05032014_03182015_flag_full.csv', delimiter=',', unpack=True, dtype='str', skiprows=1)

我建议先做一个

data = np.loadtxt('E:\CO2_05032014_03182015_flag_full.csv', delimiter=',', dtype='str', skiprows=1)

然后检查data的性质。

print(data.shape)

我打算建议您也查看data.dtype,但已将str 指定为类型。你确定你想要那个吗?只有字符串,没有数字?

根据错误消息,我预计 data 的列数将超过 7。

loadtxt 采用usecols 参数,如果您想获取可用列的子集。

你也可以从dataunpack 列:

 co2m, h2om, day_1, month_1, year_1, hour_1, minute_1 = data[:, :7]

我不经常使用unpack 选项,因为使用二维data 数组而不是所有这些变量更容易。

如果你用过

data = np.loadtxt('E:\CO2_05032014_03182015_flag_full.csv', delimiter=',', dtype=float, skiprows=1)

那么data 将是所有浮点数,您不需要逐个元素地进行转换。

使用genfromtxt,您可以指定dtype=None,它将根据最适合列的内容加载包含字符串和数字的数组。但这会产生一个structured array, 1d 和一个化合物dtype。在这种情况下,您按名称而不是索引来寻址列。但这可能是一个太高级的问题。

=================

一个小例子

虚拟文件:

In [135]: txt=b"""one, 1, 2
two, 3, 4
three, 5, 6"""

加载为一个数组:

In [136]: data=np.loadtxt(txt.splitlines(),delimiter=',',dtype='str')
In [137]: data
Out[137]: 
array([["b'one'", "b' 1'", "b' 2'"],
       ["b'two'", "b' 3'", "b' 4'"],
       ["b'three'", "b' 5'", "b' 6'"]], 
      dtype='<U8')

In [138]: data.shape
Out[138]: (3, 3)

尝试使用 2 个变量解包:(您的错误?)

In [139]: a,b=np.loadtxt(txt.splitlines(),delimiter=',',unpack=True,dtype='str')
...
ValueError: too many values to unpack (expected 2)

usecolsfloat 相同:

In [140]: a,b=np.loadtxt(txt.splitlines(),delimiter=',',unpack=True,dtype=float,usecols=[1,2])

In [141]: a
Out[141]: array([ 1.,  3.,  5.])

In [142]: b
Out[142]: array([ 2.,  4.,  6.])

加载为结构化数组

In [148]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=None)

In [149]: data
Out[149]: 
array([(b'one', 1, 2), (b'two', 3, 4), (b'three', 5, 6)], 
      dtype=[('f0', 'S5'), ('f1', '<i4'), ('f2', '<i4')])

In [150]: data['f1']         # access by field name
Out[150]: array([1, 3, 5])

【讨论】:

非常感谢,我一定会试试的。我想我确实在电子表格中发现了一个错误,并且它有一个空白列

以上是关于Python:读取两个 csv 文件组合成一个新的 cvs 文件,错误:太多值无法解压的主要内容,如果未能解决你的问题,请参考以下文章

python 两个列表组合成一个新的列表?

用python读取一个文件夹下的所有CSV文件里某一列数据中最大值,将此最大值所在行截取到新CSV文件中?

如何通过使用 R 将每个文件的数据添加为附加行来将不同的 .csv 文件组合成一个完整的文件?

Python Pandas - 编写新的 CSV 标题行而不读取/重写整个文件

如何批量读取csv格式的文件名及文件内容到新的Excel中?

如何将两个firebase集合组合成一个新的对象数组