【问题标题】:Logging to two CSV files in parallel (python)并行记录到两个 CSV 文件(python)
【发布时间】:2017-01-18 20:00:21
【问题描述】:

我正在阅读一系列气候数据文本文件,每个文件包含 9000 行,第一行是站名、经度等信息。 从 8 到末尾的行包含气候数据。

我想读取所有文件并输出两个文件“MetLocations.csv”和“MetData.csv”,其中第一个文件由所有文件的第一行的集合组成,而第二个文件由所有文件组成气候数据。

我遍历了所有文件,阅读了信息,然后打印出来,除了一个奇怪的问题之外没有任何问题。当我做一个双'with'循环时,文件 MetLocations.csv 是空的,而当我一个接一个地循环时,它写得很好! 请查看代码以获得更清晰的视图。

这是我的代码的一部分:

with open('MetLocations.csv','wb+') as locations:
    wr_loc = csv.writer(locations, quoting=csv.QUOTE_NONE, quotechar='', delimiter=',', escapechar='\\')
    headers = ["St_Id","City","State","Country","Source","WO code","Lat","Long","TimeZone","Alt"]
    wr_loc.writerow(headers)
    with open('MetData.csv','a+')as met_data:
        wr_data = csv.writer(met_data, quoting=csv.QUOTE_NONE, quotechar='', delimiter=',', escapechar='\\',lineterminator='\n')
        headers = ["St_ID", "Year", "Month", "Day", "Hour", "Minute", "Data Source and Uncertainty Flags", "Dry Bulb Temperature"]
        wr_data.writerow(headers)

            for n, f in enumerate(filenames):
                print n, f,time.strftime('%Y-%m-%d %H:%M:%S')
                full_path = os.path.join(source, f)
                with open(full_path, 'r') as input_file:
                    content = input_file.readlines()
                    location = [n] + list_elements(content[0])[1:]
                    wr_loc.writerow(location)
                    meteo = []
                    for line in content[8:]:
                        meteo.append([n] + list_elements(line))
                    wr_data.writerows(meteo)

在上面的代码运行结束时,我发现文件 MetData.csv 中充满了数据,而文件 MetLocations.csv 是空的!

奇怪的是,当我在最后 4 行注释的情况下运行相同的代码时,MetLocations.csv 被毫无问题地填充!

是否不允许打开两个连续的 CSV 文件进行追加? 或者我的代码有什么错误?

非常感谢您的帮助。

【问题讨论】:

标签: python csv


【解决方案1】:

您需要在同一行中打开所有文件,以便它们属于同一上下文:

with open('MetLocations.csv','wb+') as locations, open('MetData.csv','w')as met_data:

     wr_loc = csv.writer(locations,
                         quoting=csv.QUOTE_NONE,
                         quotechar='', delimiter=',', escapechar='\\')

     wr_data = csv.writer(met_data,
                          quoting=csv.QUOTE_NONE,
                          quotechar='', delimiter=',',
                          escapechar='\\',lineterminator='\n')

     headers = ["St_Id","City","State","Country","Source","WO code","Lat","Long","TimeZone","Alt"]
     wr_loc.writerow(headers)

     headers = ["St_ID", "Year", "Month", "Day", "Hour", "Minute", "Data Source and Uncertainty Flags", "Dry Bulb Temperature"]
     wr_data.writerow(headers)

     for n, f in enumerate(filenames):
         print n, f,time.strftime('%Y-%m-%d %H:%M:%S')
         full_path = os.path.join(source, f)
         with open(full_path, 'r') as input_file:
            # your code here

【讨论】:

  • 我现在试试,如果成功,我会标记为已接受。谢谢
  • 不幸的是,它也失败了! MetLocations.csv 仍为空白
  • 不能为空,必须有标题行;除非您有围绕此代码的其他代码。
  • 除非我注释了最后四行,否则即使标题行也不会写!我没有隐藏代码,很奇怪!不是吗?
  • 你到底在说什么最后四行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 2012-08-12
  • 2019-03-27
  • 2013-04-22
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多