簡體   English   中英

如何使用 Python 讀取具有不同列數的 csv 文件

[英]How to read csv files with different amounts of columns using Python

import glob
files = glob.glob("Data/*.csv")
df = pd.concat((pd.read_csv(f) for f in files))
print(df)

我收到一條錯誤消息:“ParserError:錯誤標記數據。C 錯誤:第 273 行中應有 39 個字段,看到 40”。 然后根據這個問題: import csv with different number of columns using Pandas ,我嘗試使用 StringIO 和 BytesIO 傳入列的名稱,然后我收到如下錯誤:“TypeError: initial_value must be str or None, not list”或“TypeError:需要一個類似字節的對象,而不是'list'”。 我正在查看 20 多個 csv 文件。

看起來您尚未嘗試所有解決方案,因為您在共享的鏈接中實際上有答案: https ://stackoverflow.com/a/57824142/8805842 如果您檢查 .csv 文件中的最后一行/最后一列單元格,您會看到你為什么會出錯。

解決方案(從您的問題鏈接中簡單復制/粘貼)多 2 行以刪除不需要的/空列

    ### Loop the data lines
    with open("storm_data_search_results.csv", 'r') as temp_f:
        # get No of columns in each line
        col_count = [ len(l.split(",")) for l in temp_f.readlines() ]
    
    ### Generate column names  (names will be 0, 1, 2, ..., maximum columns - 1)
    column_names = [i for i in range(0, max(col_count))]
    
    ### Read csv
    df = pd.read_csv("storm_data_search_results.csv", header=None, delimiter=",", names=column_names)
    
    # my addition
    df.columns = df.iloc[0] # create headers from the first row
    df = df.iloc[:, 0:39] # keeping data frame with named headers only

更新OMG,小心......他們在 .csv 中提供的數據實際上結構不正確......只需向下滾動它......如果你可以使用任何其他來源, - 使用它,除非你不需要“評論”,您可以刪除它們。

假設問題來自多行文本字段並且很容易弄亂......你可以使用正則表達式刪除它們: re.subn(r'(".*?")',"_______________",xx,xx.count('"'), re.DOTALL)

此外,假設所有文件中的標題都是不變的,您可以在文本中處理所有內容,然后解析一次。


# Read headers
headers = open(files[0]).read().split('\n',1)[0].split(',')

# Read all files and remove headers
xx = [open(ff).read().split('\n',1)[1] for ff in files]

# Remove the comments fields
dd = [re.sub(r'(".*?")',"__",x,x.count('"'), re.DOTALL) for x in xx]

# Load as CSV
df = pd.read_csv(StringIO(''.join(dd), names = headers)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM