我在嘗試用 pandas 讀取這個 .csv 檔案時遇到了困難。
"Sección;""Descripción Sección"";""Servicio"";""Descripción Servicio"";""Programa"";""Descripción Programa"";""Capítulo"";""Descripción Capítulo"";""Subconcepto"";""Descripción Subconcepto"";""Proyecto de Inversión"";""Nombre"";""CT"";""Isla"";""Importe""",,,,
"01;""Parlamento"";""0101"";""Servicios Generales"";""911A"";""Actuación Legislativa y de Control "";""1"";""GASTOS DE PERSONAL"";""10000"";""Retrib.básic. y otras ret. del Gob.y altos Cargos"";"""";"""";"""";"""";3.836.041",,,,
"01;""Parlamento"";""0101"";""Servicios Generales"";""911A"";""Actuación Legislativa y de Control "";""2"";""GASTOS CORRIENTES EN BIENES Y SERVICIOS"";""21900"";""Otro inmovilizado material"";"""";"""";"""";"""";1.500",,,,
"01;""Parlamento"";""0101"";""Servicios Generales"";""911A"";""Actuación Legislativa y de Control "";""2"";""GASTOS CORRIENTES EN BIENES Y SERVICIOS"";""22001"";""Prensa", revistas," libros y otras publicaciones"";"""";"""";"""";"""";111.000",,
header = ["Sección", "Descripción Sección", "Servicio", "Descripción Servicio", "Programa", "Descripción Programa", "Capítulo", "Descripción Capítulo", "Subconcepto", "Descripción Subconcepto", "Proyecto de Inversión", "Nombre", "CT", "Isla", "Importe"]
我嘗試了不同的東西,例如使用正則運算式并將其作為固定寬度的表格讀取,但沒有運氣。
# With regex
data = pd.read_csv("file.csv", engine='python', sep='("";"")|("";)|(;"")')
# Table of fixed width
data = pd.read_fwf("file.csv")
這是所需的輸出:
Sección,Descripción Sección,Servicio,Descripción Servicio,Programa,Descripción Programa,Capítulo,Descripción Capítulo,Subconcepto,Descripción Subconcepto,Proyecto de Inversión,Nombre,CT,Isla,Importe
1,Parlamento,101,Servicios Generales,911A,Actuación Legislativa y de Control,1,GASTOS DE PERSONAL,10000,Retrib.básic. y otras ret. del Gob.y altos Cargos,,,,,"3,836,041"
1,Parlamento,101,Servicios Generales,911A,Actuación Legislativa y de Control,2,GASTOS CORRIENTES EN BIENES Y SERVICIOS,21900,Otro inmovilizado material,,,,,"1,500"
1,Parlamento,101,Servicios Generales,911A,Actuación Legislativa y de Control,2,GASTOS CORRIENTES EN BIENES Y SERVICIOS,22001,"Prensa, revistas, libros y otras publicaciones",,,,,"111,000"
謝謝你的想法!!
uj5u.com熱心網友回復:
正如我在評論中提到的,這個特別討厭:
- 它是帶有逗號分隔符、引號封裝和雙引號作為轉義字符的常規格式 csv。但所有資料都在第一列。
- 第一列中的資料本身由分號分隔并使用引號封裝(由外部 csv 正確轉義)但其封裝的雙引號文字不會被外部 csv 或內部 csv 轉義......它是很奇怪。因此,第一列分隔資料中的逗號被包裹在其中的真實 csv 視為實際逗號,從而導致資料格式不正確。
本質上,它是 csv 中的 csv,并且由于 csv 的兩層都使用引號封裝,但最內層沒有正確轉義,因此格式錯誤。
一種選擇是將每一行作為一整列讀取并在匯入后對其進行清理:
#read the entire line into a single dataframe column
df = pd.read_csv('file.csv', header=None, names=['data'], sep='|')
#replace commas and double quotes with a blank
data = df.data.str.replace('[,]*$|"','',regex=True)
#create a new data frame by splitting the single column above on a semicolon using lines 1:<end>, use line 0 as the header, splitting it using the same logic.
df_split = pd.DataFrame(data[1:].str.split(';').tolist(), columns = data[0].split(';'))
display(df_split)
----- --------- --------------------- ---------- ---------------------- ---------- ------------------------------------ ---------- ----------------------------------------- ------------- --------------------------------------------------- ----------------------- -------- ---- ------ -----------
| idx | Sección | Descripción Sección | Servicio | Descripción Servicio | Programa | Descripción Programa | Capítulo | Descripción Capítulo | Subconcepto | Descripción Subconcepto | Proyecto de Inversión | Nombre | CT | Isla | Importe |
----- --------- --------------------- ---------- ---------------------- ---------- ------------------------------------ ---------- ----------------------------------------- ------------- --------------------------------------------------- ----------------------- -------- ---- ------ -----------
| 0 | 01 | Parlamento | 0101 | Servicios Generales | 911A | Actuación Legislativa y de Control | 1 | GASTOS DE PERSONAL | 10000 | Retrib.básic. y otras ret. del Gob.y altos Cargos | | | | | 3.836.041 |
| 1 | 01 | Parlamento | 0101 | Servicios Generales | 911A | Actuación Legislativa y de Control | 2 | GASTOS CORRIENTES EN BIENES Y SERVICIOS | 21900 | Otro inmovilizado material | | | | | 1.500 |
| 2 | 01 | Parlamento | 0101 | Servicios Generales | 911A | Actuación Legislativa y de Control | 2 | GASTOS CORRIENTES EN BIENES Y SERVICIOS | 22001 | Prensa, revistas, libros y otras publicaciones | | | | | 111.000 |
----- --------- --------------------- ---------- ---------------------- ---------- ------------------------------------ ---------- ----------------------------------------- ------------- --------------------------------------------------- ----------------------- -------- ---- ------ -----------
這有點笨拙,因為它只是用任何內容替換雙引號,即使您的資料中可能有雙引號(盡管很難判斷您是否這樣做,而且很可能它們都是格式錯誤的)。
uj5u.com熱心網友回復:
我想我知道發生了什么,它看起來是一個普通的分號;分隔的檔案,但是它被讀取然后寫入就好像它是一個逗號,分隔的檔案,這增加了很多不必要的引號。
因此,另一種解決方案是使用占位符搜索和替換真實引號:
- 首先搜索并替換
""為"$QUOTE$"(所以quote-placeholder-quote) - 然后
"為空(即洗掉所有"引號字符) - 最后將占位符替換
$QUOTE$為"
所以在代碼中是這樣的:
infile = open('file.csv', 'r', encoding='utf8')
outfile = open('file_output.csv', 'w', encoding='utf8')
for line in infile.readlines():
# remove single quotes AND replace double quote with single quote
adjline = line.replace('""', '"""').replace('"', '').replace('"', '"')
outfile.write(adjline)
infile.close()
outfile.close()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505738.html
