我有一个包含
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"}
您可以导入子进程来执行 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')