我需要將表的第一列寫入變數,并將剩余的列(它們的數量可能會有所不同)寫入串列,以便從串列中獲取所需的值。我正在嘗試獲取電子郵件地址,但桌子本身就是粥,所以需要檢查每一列。
with open('data.csv', 'r', encoding='utf-8-sig', newline='') as file:
reader = csv.reader(file)
name = list(next(reader))
for items in list(reader):
for item in items:
if '@' in item:
if not item in emails:
emails.append(item)
with open('result.csv', 'a', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file, delimiter=';')
for email in emails:
writer.writerow(
(
name,
email
)
)
輸入:
Наименование,Описание,Адрес,Комментарий к адресу,Почтовый индекс,Микрорайон,Район,Город,Округ,Регион,Страна,Часы работы,Часовой пояс,Телефон 1,E-mail 1,Веб-сайт 1,Instagram 1,Twitter 1,Facebook 1,ВКонтакте 1,YouTube 1,Skype 1,Широта,Долгота,2GIS URL
Магазин автозапчастей,,"Мира, 007",,655153,,,Черногорск,Черногорск городской округ,Республика Хакасия,Россия,Пн: 09:00-18:00; Вт: 09:00-18:00; Ср: 09:00-18:00; Чт: 09:00-18:00; Пт: 09:00-18:00; Сб: 09:00-18:00, 07:00,89130502009,[email protected],http://avtomagazin.2gis.biz,,,,,,,53.805192,91.334047,https://2gis.com/firm/9711414977516651
Спектр-Авто,автотехцентр,"Вяткина, 4",1 этаж,655017,,,Абакан,Абакан городской округ,Республика Хакасия,Россия,Пн: 09:00-18:00; Вт: 09:00-18:00; Ср: 09:00-18:00; Чт: 09:00-18:00; Пт: 09:00-18:00; Сб: 09:00-18:00, 07:00,89233931771, 79233940022@yandex.ru,http://spectr-avto.2gis.biz,,,,,,,53.716581,91.45005,https://2gis.com/firm/70000001034136187
結果是:
['Наименование', 'Описание', 'Адрес', 'Комментарий к адресу', 'Почтовый индекс', 'Микрорайон', 'Район', 'Город', 'Округ', 'Регион', 'Страна', 'Часы работы', 'Часовой пояс', 'Телефон 1', 'E-mail 1', 'Веб-сайт 1', 'Instagram 1', 'Twitter 1', 'Facebook 1', 'ВКонтакте 1', 'YouTube 1', 'Skype 1', 'Широта', 'Долгота', '2GIS URL'];[email protected]
['Наименование', 'Описание', 'Адрес', 'Комментарий к адресу', 'Почтовый индекс', 'Микрорайон', 'Район', 'Город', 'Округ', 'Регион', 'Страна', 'Часы работы', 'Часовой пояс', 'Телефон 1', 'E-mail 1', 'Веб-сайт 1', 'Instagram 1', 'Twitter 1', 'Facebook 1', 'ВКонтакте 1', 'YouTube 1', 'Skype 1', 'Широта', 'Долгота', '2GIS URL']; 79233940022@yandex.ru
['Наименование', 'Описание', 'Адрес', 'Комментарий к адресу', 'Почтовый индекс', 'Микрорайон', 'Район', 'Город', 'Округ', 'Регион', 'Страна', 'Часы работы', 'Часовой пояс', 'Телефон 1', 'E-mail 1', 'Веб-сайт 1', 'Instagram 1', 'Twitter 1', 'Facebook 1', 'ВКонтакте 1', 'YouTube 1', 'Skype 1', 'Широта', 'Долгота', '2GIS URL'];[email protected]
uj5u.com熱心網友回復:
如果我正確理解了這個問題,那么您真正想要輸出的是一個雙列 CSV,第一列中包含名稱,我假設它來自原始 CSV 的第一列,第二列中包含電子郵件。
如果我的假設是正確的,這應該對你有用:
import csv
with open('data.csv', 'r', encoding='utf-8-sig', newline='') as file:
reader = csv.reader(file)
header = list(next(reader))
emails = []
for items in reader:
name = items[0]
for item in items:
if '@' in item:
if not (name, item) in emails:
emails.append((name, item))
with open('result.csv', 'a', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file, delimiter=';')
for email in emails:
writer.writerow(email)
輸出:
Магазин автозапчастей;[email protected]
Спектр-Авто; 79233940022@yandex.ru
我在您的代碼中更改的內容:
- 輸入的 CSV 標頭現在被讀入
header- 你想用它做些什么嗎? - 現在
items[0]為輸入 CSV 中的每一行設定名稱。 - 該
emails串列現在是(姓名、電子郵件)對的串列。 - 優化細節:你不需要
reader變成一個串列來迭代它。只是說for items in reader:,它會更有效率,因為它會在讀取每一行時處理每一行,而不是將它們全部存盤到一個串列中。
uj5u.com熱心網友回復:
import petl
table = petl.fromcsv('data.csv', encoding='utf-8-sig')
table2 = petl.addfield(table, 'email_address', lambda r: [r[r1] for r1 in petl.header(table) if '@' in r[r1]])
table3 = petl.cut(table2, 'Наименование', 'email_address')
petl.tocsv(table3, 'result.csv', encoding='utf-8-sig', delimiter=';', write_header=True)
- 將 CSV 加載到表中
- 創建一個新欄位(列),它是包含電子郵件地址的任何欄位的聚合
- 減少(剪切)表以僅包含 2 個重要欄位:
'Наименование', 'email_address' - 將結果輸出到 CSV
輸出:
Наименование;email_address
Магазин автозапчастей;['[email protected]']
Спектр-Авто;[' [email protected]']
一定要安裝petl:
pip install petl
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/486682.html
下一篇:Python不會關閉最后一個檔案
