【问题标题】:How to use the same name of an input file for the name of an output file? [duplicate]如何使用输入文件的相同名称作为输出文件的名称? [复制]
【发布时间】:2021-08-14 03:39:00
【问题描述】:

我有以下代码:

for filename in os.listdir('/home/ripperflo/Downloads/nightlight_geotiffs'):
    if filename.endswith('.tif'):           # take TIFF-files only
        with rasterio.open(os.path.join('/home/ripperflo/Downloads/nightlight_geotiffs', filename)) as f:           # open GeoTiff and store in f
            img = f.read()          # open GeoTiff as 3D numpy array
            matrix = img[0]         # 3D array to 2D array because nighlight images has only one band
            z_norm = stats.zscore(matrix)           # normalize 2D array

            # save to npy file
            np.save('/home/ripperflo/Downloads/nightlight_z-array/', filename, z_norm)

代码运行至今。我唯一需要知道的是:如何将 numpy 数组保存为与原始输入文件同名的 .npy 文件?

因此输入文件称为'BJ2012_2.tif',输出文件应称为'BJ2012_2.npy'。该过程稍后将循环运行。因此文件夹中的每个文件都将被规范化并以相同的名称但以不同的文件格式保存在不同的文件夹中。

【问题讨论】:

  • 我不确定您的问题到底是什么。对于初学者来说,你打电话给np.save 是错误的。第一个参数是路径,第二个是数组。您正在传递三个参数。此外,docs 说:“如果文件是字符串或路径,如果文件名还没有 .npy 扩展名,则会将其附加到文件名。”。你的代码有什么问题?您当前的输出是什么,它与您的预期输出有何不同?你有错误吗?
  • 是的,我知道,我只是想说明保存的每个 numpy 文件都与其输入文件同名。这是我的问题:如何使我的输出文件与我的输入文件具有相同的名称,当然扩展名除外。这是一种不同的格式

标签: python python-3.x numpy path filenames


【解决方案1】:

如果你使用pathlib.Path 对象,你可以使用Path.stem 来获得一个减去扩展名的文件名

>>> p = Path('/home/ripperflo/Downloads/nightlight_geotiffs/BJ2012_2.tif').stem
'BJ2012_2'

您可以使用词干以正确的扩展名写入目标目录,如下所示:

np.save(f"/home/ripperflo/Downloads/nightlight_z-array/{Path(filename).stem}.npy", z_norm)

【讨论】:

  • "如果文件是字符串或路径,如果文件名中还没有 .npy 扩展名将附加到文件名。"
  • @Tomerikoo 文档确实这么说,但我想说这是“显式优于隐式”的一个很好的例子
  • 在这种情况下,如果您使用的是pathlib,那么使用Path(filename).withsuffix('.npy') 会不会更容易(更清晰)?
  • @Tomerikoo 我没有亲自使用过with_suffix,但是因为它确实可以做同样的事情。似乎它会归结为个人喜好,因为它以任何一种方式创建一个 f 字符串。我发现{Path(filename).stem}.npy 更容易阅读,但我想{Path(filename).with_suffix('.npy')} 可能被认为是明确的。无论哪种方式,我都必须尝试使用​​with_suffix,因为我知道了。
【解决方案2】:

您可以使用[:-3]这种语法从字符串末尾删除字符

例如

tmp = "filename.tif"
print(tmp[:-3])

结果

filename.

同样你可以用它从头或者尾获取字符串;

tmp = "filename.tif"
print(tmp[:3])
print(tmp[3:])

结果

fil
tif

更新您的代码以使用"{}.npy".format(filename[:-4]) 会将tif 替换为npy

# save to npy file
np.save("/home/ripperflo/Downloads/nightlight_z-array/{}.npy".format(filename[:-3]), z_norm)

【讨论】:

  • 如果将路径视为字符串,最好使用str.removesuffix。还要注意“如果文件是字符串或路径,如果文件名还没有 .npy 扩展名,它将被附加到文件名。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多