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
参数,如果您想获取可用列的子集。
你也可以从data
unpack
列:
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)
与usecols
和float
相同:
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读取一个文件夹下的所有CSV文件里某一列数据中最大值,将此最大值所在行截取到新CSV文件中?
如何通过使用 R 将每个文件的数据添加为附加行来将不同的 .csv 文件组合成一个完整的文件?
Python Pandas - 编写新的 CSV 标题行而不读取/重写整个文件