写入大量数据时为空CSV文件

时间:2018-08-03 23:27:28

标签: python csv export-to-csv

我目前正在使用Python 3进行数据抓取项目,并试图将抓取的数据写入CSV文件。我目前的流程是这样的:

class TablesTree extends Component {
  // ...

  componentDidMount() {
    const promises = this.props.tables.map(name => {
      return this.getFieldsTable(name.TABLE_NAME).then(res => {
        return {
          TABLE_NAME: name.TABLE_NAME,
          columns: res
        };
      });
    });

    Promise.all(promises).then(data => {
      this.setState({ data });
    });
  }

  getFieldsTable(table) {
    return axios
      .get(`table/columns?name=${this.data.user}&psw=${this.data.password}&schema=${this.data.schema}&table=${table}`)
      .then(response => {
        return response.data;
      })
      .catch(error => {
        console.log(error);
      });
  }

  // ...
}

此脚本完成后,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'...])

例如,如果我在header1,header2,.. 中刮了1,则

data

将创建一个CSV文件,其中包括outputFile.writerow(['header1', 'header2'...]) scrapedData = scrap(data[0]) outputFile.writerow([scrapedData.get('header1', 'header 1 NA'), ...]) 的标题和数据:

data[0]

为什么会这样?

2 个答案:

答案 0 :(得分:2)

使用w打开文件时,它会删除以前的数据

  

来自文档

     
    

w:可以写入文件,首先将其截断

  

因此,在使用w写入抓取数据后打开文件时,您只会得到一个空白文件,然后在其上写入标题,因此只能看到标题。尝试将w替换为a。因此,打开文件的新调用看起来像

outputFile = csv.writer(open('myFilepath', 'a'))

您可以详细了解有关打开文件here的模式的信息

参考:How do you append to a file?

在DYZ评论后编辑:

完成附加操作后,您还应该关闭文件。我建议使用像这样的文件:

with open('path/to/file', 'a') as file:
    outputFile = csv.writer(file)
    # Do your work with the file

这样,您不必担心要记住将其关闭。一旦代码存在with块,文件将被关闭。

答案 1 :(得分:0)

我会为此使用熊猫:

import pandas as pd
headers = ['header1', 'header2', ...]
scraped_df = pd.DataFrame(data, columns=headers)
scraped_df.to_csv('filepath.csv')

在这里,我假设您的data对象是一个列表列表。