所以我在我的作業中有這個大的 .csv 看起來像這樣:
Name| Adress| Email| Paid Value
John| x street | [email protected]| 0|
Chris| c street | [email protected]| 100|
Rebecca| y street| RebeccaFML|@dmail.com|177|
Bozo | z street| BozoSMH|@yahow.com|976|
如您所見,.csv 由管道分隔,最后兩個人的電子郵件中包含管道,導致格式問題。只有 2 個客戶有這個問題,但這些家伙每個月都會有越來越多的條目,我們必須手動在 csv 中找到它們并手動更改電子郵件。這是一個非常無聊和耗時的程序,因為檔案很大。
我們使用python處理資料,我研究了一下,找不到任何可以幫助我的東西,有什么想法嗎?
編輯:所以我想要的是一種通過代碼自動更改此電子郵件地址的方法(如 RebeccaFML|@dmail.com -> [email protected])。它確實需要是熊貓或任何東西,我接受任何形式的想法。主要是我只知道如何在我用 python 讀取檔案后進行替換,但是由于這些暫存器中有管道,它們不能正確讀取。
提前準備好
uj5u.com熱心網友回復:
為自定義行創建一個生成器在這里它應該將電子郵件列設定在第 3 位,但您可以對其進行調整
import pandas
def rows(path: str, sep: str = '|'):
with open(path) as f:
header = [*f.readline().split(sep), None]
for row in f:
row = row.rsplit('\n', 1)[0].split(sep)
if len(row) > len(header):
yield [*row[:2], ''.join((row[2], row[3])), *row[4:]]
else:
yield row
pandas.DataFrame(rows('data.csv'))
uj5u.com熱心網友回復:
一種方法是|使用正則運算式洗掉文本檔案中麻煩的管道 ( ):
import re
data = '''Name| Adress| Email| Paid Value
John| x street | Jo|[email protected]| 0|
Chris| c street | |[email protected]| 100|
Rebecca| y street| RebeccaFML|@dmail.com|177|
Bozo | z street| BozoSMH|@yahow.com|976|'''
pattern = re.compile(r"""(\|[^|] ?) # the previous pipe, i.e. a pipe followed by one or more not pipe characters
\| # the troublesome pipe
([^|]*?@. ?\|) # the rest of the email until the next pipe """, re.VERBOSE)
res = pattern.sub(r"\1\2", data)
print(res)
輸出
Name| Adress| Email| Paid Value
John| x street | [email protected]| 0|
Chris| c street | [email protected]| 100|
Rebecca| y street| [email protected]|177|
Bozo | z street| [email protected]|976|
注意data為了測驗在值中添加的額外管道。有關額外的解釋和除錯,請參見此處。
uj5u.com熱心網友回復:
您可以將正則運算式作為分隔符傳遞給read_csv. \|\s*(?!\@)將在管道上拆分(可能后跟空格),但不包括后跟 at 符號的管道。您可以隨后使用以下命令洗掉剩余的管道replace:
import pandas as pd
import io
data = '''Name| Adress| Email| Paid Value
John| x street | [email protected]| 0|
Chris| c street | [email protected]| 100|
Rebecca| y street| RebeccaFML|@dmail.com|177|
Bozo | z street| BozoSMH|@yahow.com|976|'''
df = pd.read_csv(io.StringIO(data), sep = r'(?<!\@)\s*\|\s*(?!\@)', engine='python',index_col=False,usecols=range(4)).replace('\|','', regex=True)
輸出:
| 姓名 | 地址 | 電子郵件 | 支付價值 | |
|---|---|---|---|---|
| 0 | 約翰 | x街 | 約翰@dmail.com | 0 |
| 1 | 克里斯 | c街 | 克里斯@dmail.com | 100 |
| 2 | 麗貝卡 | 街 | [email protected] | 177 |
| 3 | 博佐 | z街 | [email protected] | 976 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314406.html
下一篇:jq腳本檔案未獲取鍵/值對
