使用Python将DLY文件转换为CSV

问题描述 投票:2回答:1

我有来自ncdc的DLY文件,并希望将它们转换为CSV文件。我已经从另一篇文章中尝试了此代码,没有收到任何错误,但是也未能写入CSV文件。该代码正在读取DLY文件,但未写入CSV文件。我是Python新手,所以可以帮助您。

import glob

list_of_files =glob.glob(r'F:\testfolder\*.dly', recursive = True) #create the list of file
for file_name in list_of_files:
    FI = open(file_name, 'r')
    FO = open(file_name.replace('DLY', 'CSV'), 'w') 
for line in FI:
    FO.write(line)

    FI.close()
    FO.close()
python csv glob
1个回答
1
投票

DLY文件似乎使用固定宽度的文本格式。 specification给出每个字段中有多少个字符。要将其转换为CSV格式,需要为每个值读取正确数量的字符,然后使用逗号代替。空格也被删除。

这可以如下进行:

import glob
import csv
import os

# fields as given by the spec

fields = [
    ["ID", 1, 11],
    ["YEAR", 12, 15],
    ["MONTH", 16, 17],
    ["ELEMENT", 18, 21]]

offset = 22

for value in range(1, 32):
    fields.append((f"VALUE{value}", offset,     offset + 4))
    fields.append((f"MFLAG{value}", offset + 5, offset + 5))
    fields.append((f"QFLAG{value}", offset + 6, offset + 6))
    fields.append((f"SFLAG{value}", offset + 7, offset + 7))
    offset += 8

# Modify fields to use Python numbering
fields = [[var, start - 1, end] for var, start, end in fields]
fieldnames = [var for var, start, end in fields]

for dly_filename in glob.glob(r'F:\testfolder\*.dly', recursive=True): 
    path, name = os.path.split(dly_filename)
    csv_filename = os.path.join(path, f"{os.path.splitext(name)[0]}.csv")

    with open(dly_filename, newline='') as f_dly, open(csv_filename, 'w', newline='') as f_csv:
        csv = csv.writer(f_csv)
        csv.writerow(fieldnames)    # Write a header using the var names

        for line in f_dly:
            row = [line[start:end].strip() for var, start, end in fields]
            csv.writerow(row)

因此,您的示例DLY文件的第一个开始为:

ID,YEAR,MONTH,ELEMENT,VALUE1,MFLAG1,QFLAG1,SFLAG1,VALUE2,MFLAG2,QFLAG2,SFLAG2,VALUE3,MFLAG3,QFLAG3,SFLAG3,VALUE4,MFLAG4,QFLAG4,SFLAG4,VALUE5,MFLAG5,QFLAG5,SFLAG5,VALUE6,MFLAG6,QFLAG6,SFLAG6,VALUE7,MFLAG7,QFLAG7,SFLAG7,VALUE8,MFLAG8,QFLAG8,SFLAG8,VALUE9,MFLAG9,QFLAG9,SFLAG9,VALUE10,MFLAG10,QFLAG10,SFLAG10,VALUE11,MFLAG11,QFLAG11,SFLAG11,VALUE12,MFLAG12,QFLAG12,SFLAG12,VALUE13,MFLAG13,QFLAG13,SFLAG13,VALUE14,MFLAG14,QFLAG14,SFLAG14,VALUE15,MFLAG15,QFLAG15,SFLAG15,VALUE16,MFLAG16,QFLAG16,SFLAG16,VALUE17,MFLAG17,QFLAG17,SFLAG17,VALUE18,MFLAG18,QFLAG18,SFLAG18,VALUE19,MFLAG19,QFLAG19,SFLAG19,VALUE20,MFLAG20,QFLAG20,SFLAG20,VALUE21,MFLAG21,QFLAG21,SFLAG21,VALUE22,MFLAG22,QFLAG22,SFLAG22,VALUE23,MFLAG23,QFLAG23,SFLAG23,VALUE24,MFLAG24,QFLAG24,SFLAG24,VALUE25,MFLAG25,QFLAG25,SFLAG25,VALUE26,MFLAG26,QFLAG26,SFLAG26,VALUE27,MFLAG27,QFLAG27,SFLAG27,VALUE28,MFLAG28,QFLAG28,SFLAG28,VALUE29,MFLAG29,QFLAG29,SFLAG29,VALUE30,MFLAG30,QFLAG30,SFLAG30,VALUE31,MFLAG31,QFLAG31,SFLAG31
USC00011084,1926,01,SNOW,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,T,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6,0,,,6
USC00011084,1926,01,SNWD,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,0,,,6,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,,-9999,,,
© www.soinside.com 2019 - 2024. All rights reserved.