python - 使用 Python 将 DLY 文件转换为 CSV

标签 python csv glob

我有来自 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()

最佳答案

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,,,

关于python - 使用 Python 将 DLY 文件转换为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62165172/

相关文章:

python - 在Python中执行多线程程序以单线程运行

python - 从 DatetimeIndex 中选取特定时间范围内的时间戳

python - 如何在目录上运行 coverage.py?

java - 替代创建 String 对象的新方法?

python - 如何在 python 中找到系统上的目录,无论它位于何处?

python - Django Haystack - 如何通过 bool 字段过滤搜索结果?

javascript - 如何将列表类数据导入到d3中?

csv - 如何在 WSO2 Micro Integrator 中跳过 CSV 文件中的标题

php - 使用 'glob'显示没有扩展名的文件?

regex - 如何在 bash 中使用异常通配符?