【问题标题】:How to make python script run or all files in a directory?如何使python脚本运行或目录中的所有文件?
【发布时间】:2019-07-25 01:09:25
【问题描述】:

我有一个将 nc 文件的一部分转换为 csv 文件的脚本。脚本本身可以工作,但问题是我需要指定确切的目录,包括文件名和输出 csv。我有兴趣为文件夹 test1 中的所有 nc 文件运行脚本,并将其转换为文件夹 test2 中同名的 csv。我尝试修改脚本,但没有奏效。这是我的脚本。

import netCDF4
from netCDF4 import num2date, date2num, date2index
import pandas as pd
import numpy as np
import netCDF4
import sys
import os

path = r"C:\\Users\\chz08006\\Documents\\test1"

for filename in os.listdir(path):
    netcdf_file = r"C:\\Users\\chz08006\\Documents\\test1\\"+filename
    csv_file = r"C:\\Users\\chz08006\\Documents\\test2\\"+filename

    f = netCDF4.Dataset(netcdf_file)
    ssha = f.variables["ssha"]
    lon = f.variables['lon']
    lat = f.variables['lat']
    #time = f.variables['time']
    timedim = ssha.dimensions[0]
    times = f.variables[timedim]
    dates = num2date(times[:], times.units)

    dates = [date.strftime('%Y-%m-%d %H:%M:%S') for date in dates]
    lon_list= list(lon)
    lat_list = list(lat)
    ssha_list = list(ssha)
    lon_list = [x-360 if x>= 180 else x for x in lon_list]
    df = pd.DataFrame({'Time':dates,'Longitude':lon_list,'Latitude':lat_list,'SSHA':ssha_list})
    df.to_csv(csv_file)

我修改脚本失败的尝试是

path = r"C:\\Users\\chz08006\\Documents\\test1"

for filename in os.listdir(path):
    netcdf_file = r"C:\\Users\\chz08006\\Documents\\test1\\"+filename
    csv_file = r"C:\\Users\\chz08006\\Documents\\test2\\"+filename

以前应该是

netcdf_file = r"C:\\Users\\chz08006\\Documents\\test1\\example1.nc"
csv_file = r"C:\\Users\\chz08006\\Documents\\test2\\exampleresult.csv"

其中 example1 是 nc 文件名,exampleresult 是 csv 文件名。

【问题讨论】:

  • 您的编码是否正确缩进?因为似乎不在您上面发布的代码中。
  • 请发布错误。
  • 对不起,我缩进了。错误是它只会为目录中的第一个文件而不是其他文件创建一个 csv。
  • df.to_csv(csv_file) 也必须缩进,是吗?
  • 我想通了!我所要做的就是将 +".csv" 添加到 csv_file 行的末尾。

标签: python python-3.x pandas dataframe ncdf4


【解决方案1】:

您可以使用 glob 模块获取带有 .nc 扩展名的文件列表。

import glob

for netcdf_file in glob.glob(r'C:\Users\chz08006\Documents\test1\*.nc'):
    print(netcdf_file)

您可以使用os.path.split将文件路径拆分为父目录路径和文件名。

import glob
import os

for netcdf_file in glob.glob(r'C:\Users\chz08006\Documents\test1\*.nc'):
    directory, ncfilename = os.path.split(netcdf_file)
    print(directory)        # C:\Users\chz08006\Documents\test1
    print(ncfilename)       # *.nc

您可以使用 os.path.splitext 来拆分文件名和扩展名。

for netcdf_file in glob.glob(r'C:\Users\chz08006\Documents\test1\*.nc'):
    directory, ncfilename = os.path.split(netcdf_file)
    print(directory)        # C:\Users\chz08006\Documents\test1
    print(ncfilename)       # filename.nc

    name, ext = os.path.splitext(ncfilename)
    print(name)             # filename
    print(ext)              # nc

现在你可以建立CSV文件名,然后你可以使用os.path.join建立CSV文件路径。

import glob
import os

csvparent = r"C:\Users\chz08006\Documents\test2"

for netcdf_file in glob.glob(r'C:\Users\link\test1\*.nc'):
    directory, ncfilename = os.path.split(netcdf_file)
    print(directory)        # C:\Users\chz08006\Documents\test1
    print(ncfilename)       # *.nc

    name, ext = os.path.splitext(ncfilename)
    print(name)             # filename
    print(ext)              # nc

    csvname = name + ".csv"
    csvpath = os.path.join(csvparent, csvname)
    print(csvpath)          # C:\Users\chz08006\Documents\test2\filename.csv

现在,变量 csvpath 包含您需要的内容。它是与 *.nc 文件同名但扩展名为 .csv 的 CSV 文件的路径,位于 test2 目录中。

我希望这会有所帮助。

【讨论】:

  • 建议改用pathlib.Path,从目录和扩展名中拆分文件会更好。如果您有p = Path('qwerty/asdf.txt'),那么p.parent 是文件所在的目录,p.stem 是不带扩展名的文件名。
猜你喜欢
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2011-11-07
  • 1970-01-01
相关资源
最近更新 更多