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

问题描述 投票:0回答:1

我有一个包含

file_name 
和相应的
text 
的数据框,我想通过连接一些文本或数字来更新
file_name
imgs
文件夹中的图像名称,
input_folder
的结构看起来像:

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

               |--- train.jsonl

train.jsonl
文件有:

{"file_name": "0.jpg", "text": "The Fulton County Grand Jury said Friday an investigation"}
{"file_name": "1.jpg", "text": "of Atlanta's recent primary election produced \"no evidence\" that"}
path ="input_folder/train.jsonl"
df = pd.read_json(path_or_buf = input_file,   lines=True,)
print(df.head())

# rename file_name col
new_df['file_name'] = df['file_name '].apply(lambda x: 'A' + x)
# def rename(df['file_name'],new_df['file_name'])

我期待的是:通过重命名

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"}

使用 @harriet 给出的代码片段后,我在

train.jsonl
文件中有了正确的新图像名称和相应的文件名:但我有一个新问题,这是一个 Unicode 问题,因为文本是匈牙利语,有一些无法识别的特殊字符 例如我在
train.jsonl
中得到的输出目录

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

但我期望的是:

{"file_name": "A_0.jpg", "text": "Elégedetlenek az emberek a közoktatással? Belföld - Magyarország hírei"}

python pandas dataframe deep-learning operating-system
1个回答
2
投票

您可以导入子进程来执行 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 你必须使用深拷贝,因为浅拷贝将存储对原始数据帧数据的引用。

EDIT.1 * 在将该文件传递给 .to_json 之前,您需要打开新的数据帧并将 to 编码设置为 utf-8;并且,传递参数 force_ascii=False (force_ascii; bool, default True--Force encoded string to be ASCII.) *

EDIT.2 我想我明白你在说什么——这是因为我没有从新的 jsonl 本身重命名图像名称(就像你在问题中指定的方式)——你可以将文件名保存为元组(原始的,新的)在列表中。然后,我们可以遍历这些文件名元组并在 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')
© www.soinside.com 2019 - 2024. All rights reserved.