首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解析python中的csv文件?

如何解析python中的csv文件?
EN

Stack Overflow用户
提问于 2022-06-03 18:25:00
回答 2查看 280关注 0票数 0

我需要将表的第一列写入变量,其余的列(它们的数目可能有所不同)被写入列表,以便从列表中获得所需的值。我正在尝试获取电子邮件地址,但是表本身就是粥,所以每一列都需要检查。

代码语言:javascript
复制
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
                )
            )

输入:

代码语言:javascript
复制
Наименование,Описание,Адрес,Комментарий к адресу,Почтовый индекс,Микрорайон,Район,Город,Округ,Регион,Страна,Часы работы,Часовой пояс,Телефон 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,grandauto007@mail.ru,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

结果是:

代码语言:javascript
复制
['Наименование', 'Описание', 'Адрес', 'Комментарий к адресу', 'Почтовый индекс', 'Микрорайон', 'Район', 'Город', 'Округ', 'Регион', 'Страна', 'Часы работы', 'Часовой пояс', 'Телефон 1', 'E-mail 1', 'Веб-сайт 1', 'Instagram 1', 'Twitter 1', 'Facebook 1', 'ВКонтакте 1', 'YouTube 1', 'Skype 1', 'Широта', 'Долгота', '2GIS URL'];grandauto007@mail.ru
['Наименование', 'Описание', 'Адрес', 'Комментарий к адресу', 'Почтовый индекс', 'Микрорайон', 'Район', 'Город', 'Округ', 'Регион', 'Страна', 'Часы работы', 'Часовой пояс', 'Телефон 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'];zhvirblis_yuliya@mail.ru
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-03 19:21:18

如果我正确地理解了这个问题,你真正想要输出的是一个两列CSV,在第一列中有名字,我假设它来自最初CSV的第一列,而电子邮件来自第二列。

如果我的假设是正确的,这应该适用于你:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
Магазин автозапчастей;grandauto007@mail.ru
Спектр-Авто;+79233940022@yandex.ru

我在您的代码中更改的内容:

输入的CSV头现在被读取到pairs.

  • Optimization --您想要对它做什么吗?
  • 现在为输入CSV中的每一行设置了名称。
  • emails列表现在是一个包含(名称、电子邮件) header详细信息的列表:您不需要将reader转换为一个列表来迭代它。只需说for items in reader:,它就会更有效率,因为它将在读取每一行时处理它,而不是将它们全部存储到一个列表中。
票数 0
EN

Stack Overflow用户

发布于 2022-06-03 20:24:32

代码语言:javascript
复制
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加载到一个表中,创建一个新的字段(列),该字段(列)是包含电子邮件( address

  • Reduce(cut) )的所有字段的聚合,该表仅包含两个重要字段:'Наименование', 'email_address'

  • Output (结果到CSV

)

输出:

代码语言:javascript
复制
Наименование;email_address
Магазин автозапчастей;['grandauto007@mail.ru']
Спектр-Авто;['+79233940022@yandex.ru']

确保安装petl

代码语言:javascript
复制
pip install petl
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72493737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档