做推薦系統研究時,需要處理乙個包含10億條使用者資料的10g+的大csv檔案,直接用pandas讀取,記憶體不夠載入全部資料。想先對大檔案進行分割處理後,再逐個檔案處理。
將csv檔案按條目(行)數量進行分割為若干小檔案,儲存在待分割路徑資料夾下。
import pandas as pd
from pathlib import path
############################################
# @ res_file_path 待分割檔案路徑
res_file_path = path(r"e:\***\***.csv"
)# @ split_size 分割大小 這裡是100萬條乙個檔案
split_size =
10**
6############################################
tar_dir = res_file_path.parent/
("split_"
+res_file_path.name.split(
".")[0
])ifnot tar_dir.exists():
tar_dir.mkdir(
)print
("建立資料夾\t"
+str
(tar_dir)
)print
("目標路徑:\t"
+str
(tar_dir)
)print
("分割檔案:\t"
+str
(res_file_path)
)print
("分割大小:\t"+""
.format
(split_size)
)tmp = pd.read_csv(res_file_path,nrows =10)
columns = tmp.columns.to_list(
)idx =
0while
(len
(tmp)
>0)
: start =1+
(idx*split_size)
tmp = pd.read_csv(res_file_path,
header =
none
, names = columns,
skiprows = start,
nrows = split_size)
iflen
(tmp)
<=0:
break
file_name = res_file_path.name.split(
".")[0
]+"_{}_{}"
.format
(start,start+
len(tmp))+
".csv"
file_path = tar_dir/file_name
tmp.to_csv(file_path,index=
false
) idx+=
1print
(file_name +
"\t儲存成功"
)
通過pd.read_csv() 的skiprows引數來跳躍讀取資料,可以達到分批次讀取資料的效果。
也可以通過設定pd.read_csv()方法的iterator
引數,返回迭代器物件來實現劃分。
或者設定pd.read_csv()方法的chunksize
引數,指定每次讀入資料塊的大小,不斷地讀取資料達到分割的效果。
我是感覺skiprows方法比較靈活啦!
csv大檔案分割以及新增表頭
為了減輕編輯的工作,某種情況下 上可能用會到csv格式的檔案進行資料匯入,但一般 除了有上傳檔案大小限制以外,還有就是php指令碼語言讀取檔案到記憶體一些以及寫入到mysql中會超過最大範圍。因此只考慮到用分割檔案來實現。當然偷懶就沒有用到其他工具匯入的方式了 1.轉換csv檔案的到對應的編碼。這個...
利用python對csv檔案進行分割
有個任務,就是將乙個大的csv分割為幾個小的csv,當然是的包含表頭的。於是,我想到了類似於,用雙指標來做。import csv import os path users mac desktop 186 3.csv with open path,r newline as file csvreader...
linux檔案分割(將大的日誌檔案分割成小的)
linux下檔案分割可以通過split命令來實現,可以指定按行數分割和安大小分割兩種模式。linux下檔案合併可以通過cat命令來實現,非常簡單。在linux下用split進行檔案分割 模式一 指定分割後檔案行數 對與txt文字檔案,可以通過指定分割後檔案的行數來進行檔案分割。命令 split l ...