【问题标题】:How to rename a file with values of csv file如何使用 csv 文件的值重命名文件
【发布时间】:2017-01-14 14:05:08
【问题描述】:

更新 我有一个“图像”文件夹,在这个文件夹内有 2 个名为 18 和 19 的子文件夹

在文件夹 18 和 19 中有名为“final.png”的图像

我有一个 location.csv 文件

数字纬度经度名称

18 , 6.984719398 ,79.86861158 ,xyz

19 , 6.984719398 ,79.87759469 ,abc

问题:我想将名称从“final.png”转换为 6.984719398_79.86861158_final.png

如何编写 python 脚本或任何其他程序来完成此操作?

这是我试过的代码

import os
import pandas as pd
import csv

df = pd.read_csv("names.csv")
for i, sub_dir in enumerate(df["number"]):
    img_path = os.path.join("images", sub_dir)
    new_name = df["latitude"][i] + '_' + df["longitude"][i]+"_final.png"
    os.rename(os.path.join(img_path, "final.png"),
              os.path.join(img_path, new_name))

【问题讨论】:

  • 你能告诉我们你的尝试吗?我不是很严格或任何东西,但如果有一个输入/输出示例或一些代码,即使其中有漏洞也会更清楚。
  • 这些是图像文件这一事实无关紧要。我建议您将 CSV 数据读入字典,以数字字符串作为键,将字母字符串作为值。这将使您快速查找与文件夹名称相对应的正确字母。查看osos.path 模块,了解可以列出文件夹名称的函数和可用于重命名文件的函数。
  • @Downvoter :这是一个有效的问题,有一个合乎逻辑的答案。为什么有人会对此投反对票?这是严重的误导

标签: python python-2.7 csv


【解决方案1】:

这应该可以工作,假设您安装了 pandas 库 (http://pandas.pydata.org/):

import os
import pandas as pd

df = pd.read_csv("file.csv")
for i, sub_dir in enumerate(df["sub_directories"]):
    img_path = os.path.join("Images", sub_dir)
    new_name = df["filenames"][i] + "_final.png"
    os.rename(os.path.join(img_path, "final.png"), os.path.join(img_path, new_name))

请注意,此代码重命名文件,它不会将它们复制到不同的位置。它还假设 csv 的子目录列的名称为“sub_directories”,文件名列的名称为“filenames”

【讨论】:

  • 我试过这个,但它给了我一个错误“'numpy.int64' object has no attribute 'startswith'”,我在'images folder'中运行了脚本
  • 我们正在遍历 csv 中的所有文件夹——如果 CSV 中有其他条目不作为文件夹存在,这不会失败吗?
  • @OwenHempel 这种方法有效吗?我认为如果有不匹配的条目,它会跳过而不会失败
  • @OwenHempel 是的,我假设 CSV 中的所有条目都是有效文件夹以保持代码简单。使用os.path.isdir()函数很容易检查文件夹是否存在
  • @MadhukaHarith 你应该在“Images”文件夹之外运行脚本,或者,如果你想在其中运行它,你应该从脚本中删除img_path并直接使用sub_dir跨度>
【解决方案2】:

所以首先,我将首先在没有熊猫的情况下这样做。看起来使用 pandas 会导致您的错误。

试试这个:

student_dict = {}
with open(file.csv, 'r') as f:
  for line in f:
  l = line.split(',')
    student_dict[l[0]] = l[1]

此时,您将有一个(字符串——这很重要)学生编号作为键,匹配名称作为值。

现在我们可以遍历您的文件夹并重命名其中的文件。

for dir in [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(current_path, name))]: #this ugly line generates all subdirs in your current dir
  new_name = student_dict[dir] + "_final.png"
  os.rename(os.path.join(img_path, "final.png"), os.path.join(img_path, new_name))

【讨论】:

  • “a_dir”指的是什么?我假设它不是文件夹的路径,因为还有另一个“img_path”变量。
  • 我刚刚搜索了“列出所有python子目录”。
【解决方案3】:

解决方案

你好,这是一个简单的解决方案

#!/usr/bin/python    
import os
import csv

myfile  = open('names.csv', "rb")
reader = csv.reader(myfile)
path="/home/images/"

rownum = 0
for row in reader:
    # Save header row.
    if rownum == 0:
        header = row //I put this line just to skip it
    else:
        oldPath=path+row[0]+'/'+"final.png"
        newPath=oldPath+row[3]+'_'+"final.png" 
        os.rename(oldPath,newPath) 
    rownum += 1

myfile.close()

解释

正如我在问题中解释的那样,我有“图像”文件夹,并将其保存在“路径变量”中。我还有一个 name.csv,我将它保存在“myFile”变量中。在循环的第二次迭代中(在标头之后)

row[0]=18 so oldPath="/home/images/18/final.png"

row[3]="abc" 所以 newPath="/home/images/18/abc_final.png"

所以在 os.rename() 函数之后,两个文件夹中的文件名都会变成 abc_final.png。

如果你觉得这有帮助,请点赞我的问题和答案:)

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2020-12-31
    • 2017-12-23
    • 2020-06-19
    • 2017-03-31
    • 1970-01-01
    • 2013-10-25
    • 2020-04-11
    相关资源
    最近更新 更多