Python csv.writerows () Пишет во многие столбцы в одной строке, а не во многие строки и в один столбец, как требуется / ожидается - PullRequest
0 голосов
/ 19 мая 2019

Проблема и вопрос в следующем: почему csv.writerows() выводит множество столбцов в одной строке только вместо нескольких строк и одного столбца, как требуется и ожидается?

Вот подробности:

Мне нужно собрать много электронных писем с разных страниц веб-сайта, и у меня нет времени копировать / вставлять каждое электронное письмо.

Итак, я разработал скребок для электронной почты веб-страницы HTML, используя несколько стандартных библиотек на Python, а также стороннюю библиотеку Beautiful Soup 4.

Сценарии, которые я разработал, подключаются к веб-странице или, в данном случае, к локальному файлу на моем компьютере.

Сценарий прекрасно работает для очистки и сбора всех тегов привязки HTML (<a></a>) из файла HTML, а затем компилирует их в список тегов привязки.

Затем он извлекает адреса электронной почты с помощью регулярных выражений, а затем делает два экземпляра каждого адреса электронной почты (которые находятся в тегах привязки) строчными, чтобы я мог объединить их в набор уникальных электронных адресов. адреса электронной почты.

Затем я преобразовываю этот набор уникальных адресов электронной почты в список адресов электронной почты, а затем размещаю их в алфавитном порядке с помощью метода sort() объектов списка Python.

Затем я преобразую этот алфавитный список электронных писем в набор букв алфавита.

Затем я добавляю этот набор букв алфавита в список, содержащий ровно один элемент (т. Е. Запись в файл CSV не разделяет каждую строку электронной почты на несколько столбцов, обнаруженных при тестировании).

Затем я записываю этот список, содержащий кортеж, в файл CSV, но метод writerows() записывает их в одну строку только с несколькими столбцами.

Я хочу записать каждую строку адреса электронной почты в несколько строк только в одном столбце.

Спасибо за помощь.

## IMPORT MODULES
## IMPORT MODULES
## IMPORT MODULES

import urllib
import bs4
import re
import pprint
import csv


## DECLARE VARIABLES
## DECLARE VARIABLES
## DECLARE VARIABLES

## EMPTY LIST FOR SCRAPED E-MAILS
ListOfEmails = []

# EMPTY SET FOR SCRAPED E-MAILS 
SetOfEmails = set()

## HEADERS FOR OUTPUT TO CSV FILE
##headers = ['emails'] 

## ROWS FOR E-MAILS FOR OUTPUT TO CSV FILE
ListWithOneTuple = []


## BEGIN MAIN PROGRAM
## BEGIN MAIN PROGRAM
## BEGIN MAIN PROGRAM

## OPEN LOCAL HTML FILE; READ THE HTML DOCUMENT
file = urllib.request.urlopen("file:///c://Python372/local_venv/index.html")
##print(file)
##print(type(file))
##print("\n")

## PARSE THE HTML; MAKE BEAUTIFUL SOUP
soup = bs4.BeautifulSoup(file, features="html.parser")
##print(soup)
##print(type(soup))
##print("\n")

## FIND ALL <a> ANCHOR TAGS; MAKE LIST OF ANCHOR TAGS
ListOfAnchors = soup.find_all("a")
##pprint.pprint(ListOfAnchors)
##print("\n")
##print("Number of Anchor Tags = ", len(ListOfAnchors))
##print("\n")

## FOR EACH ELEMENT IN LIST OF ANCHORS...
for each in ListOfAnchors:
    ##print(each)

    ## CONVERT EACH BEAUTIFUL SOUP OBJECT INTO STRING
    each = str(each)
    ##print(type(each))

    ## REGEX TO EXTRACT E-MAILS TO LIST
    ListOfMatches = re.findall("([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)", each)     
    ##print("ListOfMatches = ", type(ListOfMatches))

    ## FOR EACH ELEMENT IN LIST, MAKE E-MAILS LOWERCASE
    for email in ListOfMatches:

        ## CONVERT E-MAILS TO LOWERCASE
        EmailLowercase = email.lower()
        ##print(EmailLowercase, type(EmailLowercase))
        ##print("\n")

        ## APPEND E-MAILS TO LIST OF E-MAILS
        ListOfEmails.append(EmailLowercase)

## TEST PRINT LIST OF E-MAILS
##print("\n")    
##print("ListOfEmails = ", ListOfEmails)
##print(type(ListOfEmails), len(ListOfEmails))

## CONVERT LIST OF E-MAILS TO SET OF E-MAILS
SetOfEmails = set(ListOfEmails)

## TEST PRINT SET OF E-MAILS
##print("\n") 
##print("SetOfEmails = ", SetOfEmails)
##print(type(SetOfEmails), len(SetOfEmails))

## CONVERT SET OF E-MAILS BACK TO LIST OF E-MAILS FOR NEXT STEP ALPHABETIC SORTING
ListOfEmailsAlphabetic = list(SetOfEmails)

## ALPHABETIZE LIST OF E-MAILS
ListOfEmailsAlphabetic.sort()

## TEST PRINT ALPHABETIC LIST OF E-MAILS
print("\n") 
print(ListOfEmailsAlphabetic, type(ListOfEmailsAlphabetic), len(ListOfEmailsAlphabetic))

## CONVERT ALPHABETIC LIST OF E-MAILS TO TUPLE OF ALPHABETIC E-MAILS    
TupleOfEmailsAlphabetic = tuple(ListOfEmailsAlphabetic)    
print(TupleOfEmailsAlphabetic, type(TupleOfEmailsAlphabetic), len(TupleOfEmailsAlphabetic))

## APPEND TUPLE OF ALPHABETIC E-MAILS TO LIST TO MAKE LIST OF ONE TUPLE ITEM
ListWithOneTuple.append(TupleOfEmailsAlphabetic)

## TEST PRINT ROWS FOR CSV OUTPUT
print("\n")
print(ListWithOneTuple, type(ListWithOneTuple), len(ListWithOneTuple)) 

## OPEN CSV FILE TO OUTPUT LIST OF E-MAILS
with open('CSVofEmails.csv','w', newline='') as CSVFile:
    FileCSV = csv.writer(CSVFile, delimiter=';')
    ##FileCSV.writerow(headers)
    FileCSV.writerows(ListWithOneTuple)



## END MAIN PROGRAM
## END MAIN PROGRAM
## END MAIN PROGRAM

## GAME OVER
## GAME OVER
## GAME OVER

1 Ответ

1 голос
/ 19 мая 2019

Это должно работать.

Можете ли вы изменить последний кусок кода следующим образом.

content = [[i] for i in ListWithOneTuple[0]]

# OPEN CSV FILE TO OUTPUT LIST OF E-MAILS
with open('CSVofEmails.csv', 'w', newline='') as CSVFile:
    FileCSV = csv.writer(CSVFile, delimiter=';')
    # FileCSV.writerow(headers)
    FileCSV.writerows(content)

Это работает. CSV.writerows, фактически принимает списки, подобные этому [[column, column], [column, column]], где внешний список - строка, а внутренний - столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...