【发布时间】:2018-08-16 11:24:45
【问题描述】:
我有一个csv(大小约为 750MB)。我必须将它拆分成小的 csv 每个大小不超过 30Mb。
c1,c2,c3,c4
1,a,1,4
2,a,1,4
3,b,1,4
4,b,1,4
5,b,1,4
6,c,1,4
限制是你不能在不同的文件中拥有相同的c2。
(例如,一个文件中不能有一半 b 另一个文件中的另一半)
如果 C2 的一个值本身超过 30Mb,则将与该 c2 关联的数据打印到文件中
我用 pandas 来做同样的事情;我的代码
max_size = 30 * 1000000
df = pd.read_csv("data.csv", low_memory=False)
unique_ac_id = pd.unique(df.C2)
counter = 1
df_arr = []
total_size = 0
for ac_id in unique_ac_id:
df_cur = df[df.C2 == ac_id]
size = df_cur.memory_usage(index=False, deep=True).sum()
if size > max_size:
print(f'{ac_id} size is more than max size allowded')
if total_size > max_size:
pd.concat(df_arr).to_csv(f'out/splitter_{counter}.csv', index=False)
counter += 1
df_arr.clear()
total_size = 0
df_arr.append(df_cur)
total_size += size
if len(df_arr) > 0:
pd.concat(df_arr).to_csv(f'out/splitter_{counter}.csv', index=False)
有没有更好的方法来做同样的事情?
【问题讨论】:
-
约束不可行。如果你的 c2 有一半是 a 怎么办?那样你就不能浓缩了。
-
可以将所有这些拉到一个文件中。在这种情况下,不需要考虑 30Mb。在我的数据中,这种情况很少发生。
标签: python python-3.x pandas csv