gpt4 book ai didi

python - 使用 Shutil Copy 会中断 csv 数据的循环

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:26 24 4
gpt4 key购买 nike

我正在设置一个脚本,该脚本从名为 {number}.jpg 的文件夹中获取 .jpg 图像,并将该数字乘以帧速率与 csv 文件给定的范围进行比较。然后将 jpg 复制到与包含其适合范围的 csv 相同的文件夹中。

所以 csv 数据看起来像:

477.01645354635303,1087.1628371628808
1191.5980219780615,1777.622457542435
1915.5956043956126,2525.6515684316387
2687.7457042956867,3299.803336663285
3429.317892107908,4053.6603896103848
4209.835924075932,4809.700129870082

(有很多文件,但这是一个完整示例)

每个数字都会与每个范围进行比较并放置在相应的文件夹中。如果我只打印目标文件和目标,一切正常并且结果符合预期。但如果我尝试使用任何 Shutil 复制函数(copy、copyfile、copy2),循环就会被破坏。

文件结构如下:
数据
|-培训
|--按压 (CPR)
|---按压 (CPR).csv
|---图像数据的去向
|--更多文件夹..
|-验证
|--同训练
|-测试
|--与训练相同

这是 Python 3。我正在 Ubuntu (Pop!OS) 计算机上运行 VS Code。我已经尝试了适合这种情况的每个不同的 shutil 复制函数(copycopy2copyfile) 。我尝试过复制到不同的文件夹,效果很好。如果我将文件复制到父文件夹(即上述层次结构中的 Training),而不是子目录,则它可以正常工作。不过,我需要将它们放在子目录中以用于标记目的。

for cur in file_list:
with open(cur, 'r') as img:
filename = ntpath.basename(cur)
frame_num = int(filename[:-4]) # get number from filename
frame_num = (frame_num - 1) * (30000./1001.) # it's one second from each frame in a video
training = get_folders(train_path)
for folder in training:
train_csvfile = get_files(train_path + folder)
if len(train_csvfile) > 0:
with open(train_csvfile[0], 'r', encoding='latin-1', newline='') as source:
train_reader = csv.reader(source, delimiter = ',')
for trdata in train_reader:
if frame_num > float(trdata[0]) and frame_num < float(trdata[1]):
tr_path = os.path.join(train_path + folder, ntpath.basename(cur))
copy2(cur,tr_path)
print('Copied {} to training folder {}.'.format(filename, tr_path))

获取文件和文件夹的代码:

def get_folders(a_dir):
return [name for name in os.listdir(a_dir)
if os.path.isdir(os.path.join(a_dir, name))]

def get_files(a_dir):
a_dir = Path(a_dir)
return [f for f in a_dir.glob('**/*') if f.is_file()]

file_list = get_files('/media/username/Seagate Expansion Drive/EXP 3/S1 C2/frames')

完整输出为:

Copied 000017.jpg to training folder /home/username/Downloads/Event Data CSV/Data/Training/CPR (COMPRESSION)/000017.jpg.
Copied 000018.jpg to training folder /home/username/Downloads/Event Data CSV/Data/Training/CPR (COMPRESSION)/000018.jpg.
Copied 000019.jpg to training folder /home/username/Downloads/Event Data CSV/Data/Training/CPR (COMPRESSION)/000019.jpg.
Copied 000021.jpg to training folder /home/username/Downloads/Event Data CSV/Data/Training/CPR (COMPRESSION)/000021.jpg.
Traceback (most recent call last):
File "tfinput.py", line 39, in <module>
for trdata in train_reader:
_csv.Error: line contains NULL byte

如上所述,文件已正确复制(但只有数百个中的四个)

在此脚本中,csv 文件根本没有改变。该脚本获取了四个图像并因上述错误而崩溃。它正确放置了这四个图像。如果我尝试再次运行脚本而不重新生成数据,它会立即崩溃。但是,如果我不使用复制功能,则一切正常,并且所有正确的输入和输出目录都在我的打印语句中给出。当没有复制语句时,脚本也可以重新运行而无需重新生成。这让我认为一定存在某种覆盖问题,但由于我实际上没有编辑 csv 文件,所以我无法确定它。

我希望它应该简单地将文件从源复制到目标。

编辑:我继续打印了它卡住的整个文件。它似乎所做的就是读取第一行然后崩溃。我在另一个文件上测试了这个,并确认它只是复制第一个范围内的文件,然后崩溃

编辑2:我能够通过在以for trdata in train_reader:开头的 block 上使用try- except block 来实现此工作> 但是它跳过了很多条目

编辑3:对于那些好奇的人来说,尽管我怀疑这是一个覆盖问题,但我从未弄清楚这个问题,因为在没有复制语句的情况下检查 NULL 值什么也没有出现。我重构了代码,首先创建了文件夹和文件名的文本文件,然后读取该文件并复制文件。效果很完美。

感谢您的帮助!!

最佳答案

我不认为这是副本的问题。从错误消息来看,正在读取的 CSV 文件中存在 NULL 字节。编写一些打印语句并观察该文件。

您可能会发现这很有帮助。 "Line contains NULL byte" in CSV reader (Python)

关于python - 使用 Shutil Copy 会中断 csv 数据的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56740255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com