csv解析與導(dǎo)出可通過python實現(xiàn),1.使用csv模塊基礎(chǔ)處理,適合小數(shù)據(jù)量;2.pandas庫功能強大,適用于大數(shù)據(jù)及復(fù)雜操作;3.導(dǎo)出時csv模塊寫入靈活,pandas則更簡潔高效;常見問題包括分隔符多樣、編碼差異及引號陷阱,需針對性處理。
解析CSV數(shù)據(jù),導(dǎo)入導(dǎo)出,說白了就是把那些以逗號(或者其他什么符號)分隔開的文本信息,要么讀進(jìn)來變成我們程序能理解的數(shù)據(jù)結(jié)構(gòu),要么把程序里的數(shù)據(jù)按規(guī)矩寫出去變成csv文件。這事兒聽起來簡單,但真要做到滴水不漏,可得花點心思。
要真正把CSV這事兒玩明白,我個人覺得,python是個非常趁手的工具。它內(nèi)置的csv模塊就能搞定大部分基礎(chǔ)需求,而如果你要處理的數(shù)據(jù)量大、結(jié)構(gòu)復(fù)雜,或者想更優(yōu)雅地操作,pandas庫簡直是神器。
解析(導(dǎo)入)CSV文件:
最基礎(chǔ)的,用Python的csv模塊:
import csv def parse_csv_basic(filepath): data = [] try: # newline=''是個小細(xì)節(jié),它能防止在windows系統(tǒng)上寫入CSV時出現(xiàn)額外的空行。 # encoding='utf-8'是處理中文或特殊字符的關(guān)鍵,不然很容易亂碼。 with open(filepath, 'r', newline='', encoding='utf-8') as csvfile: reader = csv.reader(csvfile) header = next(reader) # 通常第一行是表頭 for row in reader: data.append(row) print(f"成功讀取 {len(data)} 行數(shù)據(jù)。") return header, data except FileNotFoundError: print(f"錯誤:文件 '{filepath}' 不存在。") return None, None except Exception as e: print(f"讀取CSV時發(fā)生錯誤:{e}") return None, None # 示例調(diào)用 (請?zhí)鎿Q為你的CSV文件路徑) # header, rows = parse_csv_basic('your_data.csv') # if header and rows: # print("表頭:", header) # print("前5行數(shù)據(jù):", rows[:5])
如果數(shù)據(jù)量大,或者需要更強大的數(shù)據(jù)處理能力,pandas是我的首選:
import pandas as pd def parse_csv_pandas(filepath): try: # read_csv功能非常強大,能自動推斷分隔符、處理引號、跳過空行等 df = pd.read_csv(filepath, encoding='utf-8') print(f"成功使用pandas讀取 {len(df)} 行數(shù)據(jù)。") return df except FileNotFoundError: print(f"錯誤:文件 '{filepath}' 不存在。") return None except Exception as e: print(f"使用pandas讀取CSV時發(fā)生錯誤:{e}") return None # 示例調(diào)用 (請?zhí)鎿Q為你的CSV文件路徑) # df = parse_csv_pandas('your_large_data.csv') # if df is not None: # print(df.head())
pandas.read_csv簡直是萬金油,它能自動識別很多情況,比如分隔符、引號、編碼(雖然最好還是明確指定),甚至可以直接指定列的數(shù)據(jù)類型。
導(dǎo)出CSV文件:
用csv模塊寫入:
import csv def export_csv_basic(filepath, header, data): try: with open(filepath, 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(header) # 寫入表頭 writer.writerows(data) # 寫入所有行 print(f"數(shù)據(jù)已成功導(dǎo)出到 '{filepath}'。") except Exception as e: print(f"導(dǎo)出CSV時發(fā)生錯誤:{e}") # 示例調(diào)用 (假設(shè)之前有header和rows數(shù)據(jù)) # export_csv_basic('output_data.csv', header, rows)
用pandas寫入就更簡潔了:
import pandas as pd def export_csv_pandas(filepath, dataframe): try: # index=False 避免將DataFrame的索引也寫入CSV dataframe.to_csv(filepath, index=False, encoding='utf-8') print(f"數(shù)據(jù)已成功導(dǎo)出到 '{filepath}'。") except Exception as e: print(f"使用pandas導(dǎo)出CSV時發(fā)生錯誤:{e}") # 示例調(diào)用 (假設(shè)之前有df數(shù)據(jù)) # export_csv_pandas('output_dataframe.csv', df)
to_csv方法也同樣強大,index=False是個常用選項,因為DataFrame的索引通常不是我們想寫入CSV的內(nèi)容。
解析CSV文件時常見的坑與應(yīng)對策略
說實話,解析CSV這事兒,最讓人頭疼的不是代碼邏輯,而是那些“意料之外”的數(shù)據(jù)。我見過太多次因為這些小細(xì)節(jié)導(dǎo)致整個流程卡殼的情況。
- 分隔符的“個性”: 別以為CSV就一定是逗號。我遇到過用分號、制表符(TSV)、甚至豎線|做分隔符的。遇到這種情況,csv.reader可以指定delimiter參數(shù),pd.read_csv則有sep參數(shù),它甚至能自動識別一些常見的分隔符。如果你不確定,可以先讀幾行看看。
- 編碼問題,永恒的痛: UTF-8是國際通用,但國內(nèi)很多老系統(tǒng)或者excel默認(rèn)導(dǎo)出的是GBK(或GB2312)。如果文件打開亂碼,八成就是編碼不對。嘗試切換encoding=’gbk’或者encoding=’latin1’(有時候亂碼成一些奇怪符號時,latin1能幫助你看到原始字節(jié),進(jìn)而判斷真實編碼)。Python的chardet庫能幫你猜測編碼,雖然不總是100%準(zhǔn)確,但能提供很好的線索。
- 引號包裹的“陷阱”: 當(dāng)字段內(nèi)容本身包含分隔符