В настоящее время я выполняю проект очистки данных с помощью Python 3 и пытаюсь записать скребковые данные в файл CSV. Мой текущий процесс:
import csv
outputFile = csv.writer(open('myFilepath', 'w'))
outputFile.writerow(['header1', 'header2'...])
for each in data:
scrapedData = scrap(each)
outputFile.writerow([scrapedData.get('header1', 'header 1 NA'), ...])
Однако, как только этот скрипт закончен, CSV файл пуст. Если я просто запустил:
import csv
outputFile = csv.writer(open('myFilepath', 'w'))
outputFile.writerow(['header1', 'header2'...])
создается CSV файл, содержащий заголовки:
header1,header2,..
Если я просто очищу 1 в data
, например:
outputFile.writerow(['header1', 'header2'...])
scrapedData = scrap(data[0])
outputFile.writerow([scrapedData.get('header1', 'header 1 NA'), ...])
будет создан CSV файл, включающий как заголовки, так и данные для data[0]
:
header1,header2,..
header1 data for data[0], header1 data for data[0]
Почему это так?
Когда вы открываете файл с w
, он удаляет предыдущие данные
Из документов
w: открыть для записи, сначала обрезать файл
Поэтому, когда вы открываете файл после записи данных scrape с помощью w
, вы просто получаете пустой файл, а затем записываете заголовок на нем, чтобы вы видели только заголовок. Попробуйте заменить w
на a
. Таким образом, новый вызов для открытия файла будет выглядеть так:
outputFile = csv.writer(open('myFilepath', 'a'))
Вы можете узнать больше о режимах, чтобы открыть файл здесь.
Ссылка: Как вы добавляете файл?
Редактировать после комментария DYZ:
Вы также должны закрыть файл после завершения добавления. Я бы предложил использовать файл как:
with open('path/to/file', 'a') as file:
outputFile = csv.writer(file)
# Do your work with the file
Таким образом, вам не нужно беспокоиться о том, чтобы закрыть его. Как только код существует with
блоком, файл будет закрыт.
Я бы использовал Pandas для этого:
import pandas as pd
headers = ['header1', 'header2', ...]
scraped_df = pd.DataFrame(data, columns=headers)
scraped_df.to_csv('filepath.csv')
Здесь я предполагаю, что ваш объект data
- это список списков.