Python處理CSV文件

2021-12-23 鄧噔噔鄧

在數據處理過程中,可能會需要採用篩選、提取、重新生成等方法來對數據進行處理,下面以csv文件為例,介紹使用Python處理文本文件的方法。

開始之前

在面對文件讀寫類的問題時,open函數是一定繞不開的,下面先介紹幾種open函數使用的技巧。

file_path = 'test.csv'

# bad
fp = open(file_path, 'r')
fp.read()
fp.close()

# good
with open(file_path, 'r') as fp:
fp.read()

# bad
with open(file_path, 'r') as fp:
lines = fp.readlines()
for index in range(lines):
print(lines[index])
# good
with open(file_path, 'r') as fp:
for line in fp:
print(line)

# bad
with open(file1, 'r') as fp1:
with open(file2, 'w') as fp2:
for line in fp1:
fp2.write(line)

# good
with open(file1, 'r') as fp1, open(file2, 'w') as fp2:
for line in fp1:
fp2.write(line)

csv

csv文件是一類出現頻率非常高的文本文件,在python中有許多方法可以讀寫他。下面介紹兩種讀寫的方法。

在開始之前,先來介紹一下csv文件的格式,比如下面這個文件,裡面有4行,第一行是表頭或者叫列名(可以沒有表頭),每一列之間使用,隔開。後面3列是對應的內容,也是使用,進行隔開;每一行都是單獨的,行與行之間使用\n進行分割,這個\n是一個不可見字符,作用是換行。

name,age,city
liming,12,taian
zhangsan,20,heze
lisi,18,shenzhen

讀取原生方法

原生方法是指不藉助第三方庫,只使用python本身來進行讀寫。
根據上面我們對csv文件的了解,我們可以得到下面這些信息

第一行可能是表頭,也可能直接就是數據

列與列之間使用,進行分割

行與行之間使用\n進行分割

下面來編寫函數來進行解析csv文件,我們需要一個文件路徑csv_file來進行讀取,需要分隔符sep,來確定列與列之間是由什麼來進行分割的,最後還需要一個header來控制是否在最後的數據中保留第一行(因為第一行可能是表頭,不是真正的數據)

def parse_csv(csv_file, sep=',', header=False):
result = [] # 存放最終的數據
with open(csv_file, 'r') as fp:
# 如果是True,那麼可以跳過第一行
if header:
fp.readline() # 直接丟棄(讀取)第一行
for line in fp:
result.append(line.split(sep)) # 根據sep來進行分割
return result

Pandas

pandas是python中一個十分強大的數據分析工具,下面使用pandas來實現和上面代碼一樣的功能

import pandas as pd
result = pd.read_csv(csv_file, sep=',', header=None) # 包括第一行
result = pd.read_csv(csv_file, sep=',') # 不包括第一行

可以發現,兩種方式的代碼量相差很大,第二種方法幾乎是一行代碼就可以實現csv的讀取。上面兩種方法都是讀取的操作,下面來介紹寫入的操作

寫入原生方法

在寫入的時候,我們只需要構造出符合csv文件格式的字符串,然後寫入文件即可
將每一列的數據使用分隔符sep進行連接,將每一行之間的數據使用\n進行分割

data = [
['liming','12','taian'],
['zhangsan','20','heze'],
['lisi','18','shenzhen'],
]

def write_csv(data, output_file, sep=','):
with open(output_file, 'w') as fp:
for line in data:
# 使用sep將每一行中的數據連接起來
# 同時在最後加上\n來進行換行
fp.write(sep.join(line) + '\n')

pandas

import pandas as pd
data = [
['liming', '12', 'taian'],
['zhangsan', '20', 'heze'],
['lisi', '18', 'shenzhen'],
]

df = pd.DataFrame(data) # 需要先構造一個數據表
# 把構造的數據表存下來,不存表頭,不存索引
df.to_csv(output_file, header=None, index=None)

下面我將從一個具體的案例來講述如何使用python來完成文本處理的任務。

案例講解需求

有一個csv文件,第一列是gene_id,第二列是表達量

現在你需要在裡面篩選20個特定的基因,同時根據另一個文件為這20個gene_id重命名

最後將篩選出來的gene_id和expression保存到一個新的csv文件裡面

實現

下面我們也是使用兩種方法來完成這個需求

原生方法

def get_geneid_map(geneid_map_csv):
""" 將第二個csv文件轉化從dict中,舊id做key,新id做value """
result = {}
with open(geneid_map_csv,'r') as fp:
fp.readline() # 去掉表頭
for line in fp:
line = line.strip('\n') # 去掉最後的\n
line = line.split(',') # 根據,進行分割
result[line[0]] = line[1] # 存到字典裡面
return result

def parse_gene_file(gene_file,geneid_map_dict):
result = []
with open(gene_file,'r') as fp:
fp.readline() # 去掉表頭
for line in fp:
line = line.strip('\n')
line = line.split(',')
if line[0] in geneid_map_dict:
result.append([
geneid_map_dict[line[0]], # 根據舊id獲得新id
line[1] # 表達量
])

return result

def save_to_csv(result,output_file):
with open(output_file,'w') as fp:
for line in result:
fp.write(','.join(line) + '\n')

if __name__ == '__main__':
csv_file1 = 'gene.csv'
csv_file2 = 'geneid_map.csv'
csv_result = 'filter.csv'
geneid_map = get_geneid_map(csv_file2)
result = parse_gene_file(csv_file1,geneid_map)
save_to_csv(result,csv_result)

pandas

if __name__ == '__main__':
csv_file1 = 'gene.csv'
csv_file2 = 'geneid_map.csv'
csv_result = 'filter.csv'
import pandas as pd
# 讀取csv文件,數據不包含header
gene = pd.read_csv(csv_file1,sep=',')
geneid = pd.read_csv(csv_file2,sep=',')
# 使用isin篩選需要的id,同時拷貝一份
filter_gene = gene[gene['gene_id'].isin(geneid['gene_id1'])].copy()
# 構造字典,與上面構造的字典相同
geneid_map = {v['gene_id1']:v['gene_id2'] for k,v in geneid.to_dict('index').items()}
# 使用字典對舊id進行替換
filter_gene['gene_id'] = filter_gene['gene_id'].map(geneid_map)
# 保存csv,不包含表頭,不包含索引
filter_gene.to_csv(csv_result,header=None,index=None)

後臺回復csv即可獲得案例中使用的文件

相關焦點

  • Python對CSV文件的處理
    在Python中,讀取csv文件使用到的標準庫是csv,直接導入就可以了,要讀取的CSV文件內容為:見讀取CSV文件裡面內容的源碼:#!/usr/bin/env python #-*-coding:utf-8-*-#author:wuyaimport  csvdef readCsv(): with open('csvTest.csv','r') as f: rander=csv.reader(f) #對數據循環獲取
  • CSV文件在Python中的幾種處理方式
    for row in fr:    row = row.strip()    row_list = row.split(",")    fw.write(",".join(map(str, header_list)) + "\n")以上步驟完成後,在命令提示符中輸入:python csvrw.py
  • python讀寫csv文件
    文件讀寫的經典操作方式如下,通過內置的open函讀取到每行內容,按照指定的分隔符進行分隔,然後對每一列的內容進行處理。
  • Python讀寫csv文件專題教程(2)
    ,默認為c, 因為c引擎解析速度更快,但是特性沒有python引擎高,如果使用c引擎沒有的特性時,會自動退化為python引擎。skiprows還可以被賦值為某種過濾規則的函數skip_footer從文件末尾過濾行,解析器退化為python. 這是因為c解析器沒有這個特性。
  • python 處理 csv 文件
    csv 文件是一種逗號分隔的純文本形式存儲的表格數據,Python內置了CSV模塊,可直接通過該模塊實現csv文件的讀寫操作,在web應用中導出數據是比較常見操作
  • Python 處理 csv 文件
    csv 文件是一種逗號分隔的純文本形式存儲的表格數據,Python內置了CSV模塊,可直接通過該模塊實現csv文件的讀寫操作,在web應用中導出數據是比較常見操作。這篇文章介紹csv模塊的基本用法寫操作writer.writerow, 將多列數據寫入一行import csvwith open('some.csv', 'w', newline='') as f:     writer = csv.writer(f)    writer.writerow(["123", "234", "
  • 軟體應用 | Python實現CSV文件的合併與拆分
    團隊當前的主要目標是挖掘行政、經濟與社會大數據資源在經濟學學術、智庫與相關行業研究領域中的應用價值,以學術研究為標準開展大數據治理研究,努力探索大數據分析技術融入中國經濟社會研究的可行進路。 Part1引言CSV(逗號分隔值文件格式,有時也稱為字符分隔值,因為分隔字符也可以不是逗號)是一種通用的、相對簡單的文件格式,被用戶、商業和科學廣泛應用。
  • Python讀取csv文件常見的兩種方法
    一、數據存取之csv(一)什麼是csvCSV是一種通用的、相對簡單的文件格式,被用戶、商業和科學廣泛應用。最廣泛的應用是在程序之間轉移表格數據,而這些程序本身是在不兼容的格式上進行操作的(往往是私有的和/或無規範的格式)。
  • Python讀寫csv文件專題教程(1)
    1 前言Python的數據分析包Pandas具備讀寫csv文件的功能,read_csv 實現讀入csv文件,to_csv寫入到csv文件。
  • python pandas解決csv文件中的部分注釋問題
    由於通過添加注釋,文件通常可以更加清晰明了。csv文件中有注釋,這種情況是可能存在的。
  • Python讀入文件報錯的處理方法
    文章導讀:本文主要 解決python在讀入文件時的報錯:ParserError:Error tokenizing data.C error:Expected x fields in line nnn,saw y。文章分為兩部分,第一部分解釋報錯的意思,定位原因;第二部分給出解決方法。
  • python筆記5-python2寫csv文件中文亂碼問題
    對中文編碼糾結的建議儘快換python3吧,python2且用且珍惜!一、csv中文亂碼1.open打開csv文件,用writer寫入帶有中文的數據時- writer寫入單行- writers寫入多行```# coding:utf-8import csvf = open("xieru.csv", 'wb')writer =
  • 批量轉化xlsx文件為csv格式
    寫在前面python對於文件流工作做的比R包,這是我目前的感受,今天給大家貢獻一個小函數,這是趙向陽師弟編寫的,我們在處理xlsx文件過程中需要將
  • 十分鐘學會如何用Python處理CSV文件
    今天,作者就來總結一下使用Python處理物聯網行業中一種常見的文件格式:csv文件。Python中集成了專用於處理csv文件的庫,名為:csv。csv 庫中有4個常用的對象:csv.reader:以列表的形式返回讀取的數據。csv.writer:以列表的形式寫入數據。
  • python學習筆記(6):csv文件讀取
    昨天發了篇文章,是講如何讀取.xls格式文件的,今天來說下CSV文件怎麼讀取。我個人用CSV還是比較多的,因為讀取起來比較方便。小試牛刀「示例文件」「來個簡單式的」讀取csv文件,用的是csv.reader()這個方法。
  • csv文件讀寫操作 | pyhton內置csv模塊
    python也內置了csv模塊,用來操作csv文件。一、csv模塊寫入數據writer(csvfile,dialect=『excel』,**fmtparams)csvfile:文件對象dialect:編碼風格,默認為是excel,也就是用逗號(,)分隔,一般不去更改它。
  • python學習筆記 - 讀寫CSV文件
    python三方庫提供了csv庫,我們需要通過這個庫,來實現對CSV文件的讀與寫。所以我們在應用csv庫之前,需要提前安裝它。2、讀取CSV文件2.1、實例化CSV文件讀取類(DictReader)csv模塊下提供了DictReader類,它可以將普通的文本文檔讀取對象轉化為csv文檔讀取對象。
  • Python 數據處理(十三)—— IO 工具之 CSV
    Python 數據處理(十三)—— IO 工具前言前面我們介紹了 pandas 的基礎語法操作,下面我們開始介紹 pandas 的數據讀寫操作。下面列出了所有的 reader 和 writer 函數注意:後面會用到 StringIO,請確保導入# python3from io import StringIO# python2from StringIO
  • glob - 被忽略的python超強文件批量處理模塊
    Python-glob模塊簡介glob模塊通配符glob模塊是python自己帶的一個文件操作模塊,可以查找符合自己需求的的文件,並且支持通配符操作,主要包括以下三種匹配模式:**匹配所有文件,包括目錄,子目錄和子目錄裡面的文件。
  • python項目實踐分享:使用pandas處理大型CSV文件
    CSV(Comma Separated Values)作為一種逗號分隔型值的純文本格式文件,在實際應用中經常用到。如資料庫數據的導入導出、數據分析中記錄的存儲等。因此很多語言都提供了對CSV文件處理的模塊。Python也不例外,其模塊csv提供了一系列與CSV處理相關的 API。