pandas 如何使用数据框重命名图像名称?

v9tzhpje  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(141)

我有一个包含file_name和相应text的 Dataframe ,并希望通过与一些文本或数字连接来更新imgs文件夹中的file_name和图像名称,input_folder的结构如下所示:

input_folder --|
               |--- imgs -- |-- 0.jpg
                            |-- 1.jpg
                            |-- 2.jpg
                            .........

               |--- train.jsonl

train.jsonl文件具有:
x一个一个一个一个x一个一个二个x
我期待的是:更新结果数据框中的file_name列,重命名imgs文件夹中的图像名称

out_folder --|
             |-- imgs -- |-- A_0.jpg
                         |-- A_1.jpg
                         |-- A_2.jpg
                           .........

             |---- train.jsonl

train.jsonl文件具有:

{"file_name": "A_0.jpg", "text": "The Fulton County Grand Jury said Friday an investigation"}
{"file_name": "A_1.jpg", "text": "of Atlanta's recent primary election produced \"no evidence\" that"}

在使用@哈里特给出的代码片段后,我在train.jsonl文件中获得了正确的新图像名称和相应的file_name:但我有一个新的问题,这是一个Unicode的问题,因为文本是在匈牙利语有一些特殊的字符无法识别将例如我得到了train.jsonl在输出目录

{"file_name":"A_0.jpg","text":"El\u00e9gedetlenek az emberek a k\u00f6zoktat\u00e1ssal? Belf\u00f6ld - Magyarorsz\u00e1g h\u00edrei"}

但我期望的是:
x1米11米1x

icnyk63a

icnyk63a1#

您可以导入子进程来执行shell命令,以创建新目录并相应地重命名映像:

import pandas as pd
from subprocess import call

path = "input_folder/train.jsonl"
df = pd.read_json(path_or_buf=path, lines=True,)

# make a duplicate dataframe
ndf = df.copy(deep=True)
filenames = list()
for i in range(len(ndf)):
    og_fn = ndf['file_name'][i]
    new_fn = 'A_{fn}'.format(fn=og_fn)
    filenames.append((og_fn, new_fn))
    ndf.loc[i, ['file_name']] = [new_fn]

# create output directory
call(['mkdir out_folder'], shell=True)

# copy original imgs folder into out_folder
dst = '/Users/username/.../out_folder'
src = '/Users/username/.../input_folder/imgs'
cmd = 'cp -a {s} {d}'.format(s=src, d=dst)
call([cmd, src, dst], shell=True)

# write the new dataframe to '/.../out_folder/train.jsonl'
with open(f'{dst}/train.jsonl', 'w', encoding='utf-8') as f:
    f.write(ndf.to_json(orient='records', lines=True, force_ascii=False))

for og, new in filenames:
    cmd = 'mv {og} {new}'.format(og=og, new=new)
    call([cmd], shell=True, cwd=dst + '/imgs')

这应该会在input_folder所在的目录中为您提供一个output_folder,其中包含更新后的train.jsonl和imgs目录(包含名称更新后的图像)--让我知道这是否适合您。PS您必须使用深拷贝,因为浅拷贝将存储对原始 Dataframe 数据的引用。
EDIT.1 * 在将新的 Dataframe 传递给.to_json之前,您需要打开将to编码设置为utf-8的 Dataframe ;并且,传递参数force_ascii=False(force_ascii;bool,默认值为True--强制编码字符串为ASCII。)*
EDIT.2我想我明白你的意思--这是因为我没有从新的jsonl本身重命名图像名称(只是你在问题中指定的方式)--你可以将文件名保存为列表中的元组(original,new)。然后,我们可以循环这些文件名元组,并在imgs/目录中调用'mv {original} {new}':

ndf = df.copy(deep=True)
filenames = list()
for i in range(len(ndf)):
    og_fn = ndf['file_name'][i]
    new_fn = 'A_{fn}'.format(fn=og_fn)
    filenames.append((og_fn, new_fn))
    ndf.loc[i, ['file_name']] = [new_fn]
    •
    •
    •
for og, new in filenames:
    cmd = 'mv {og} {new}'.format(og=og, new=new)
    call([cmd], shell=True, cwd=dst + '/imgs')

相关问题