Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用shutil copy可中断csv数据上的循环_Python_Python 3.x_Csv_Shutil - Fatal编程技术网

Python 使用shutil copy可中断csv数据上的循环

Python 使用shutil copy可中断csv数据上的循环,python,python-3.x,csv,shutil,Python,Python 3.x,Csv,Shutil,我正在设置一个脚本,它从名为{number}.jpg的文件夹中获取.jpg图像,并将该数字乘以帧率与csv文件给定的范围进行比较。然后,jpg被复制到与csv相同的文件夹中,csv包含适合它的范围 因此,csv数据如下所示: 477.01645354635303,1087.1628371628808 1191.5980219780615,1777.622457542435 1915.5956043956126,2525.6515684316387 2687.7457042956867,3299.

我正在设置一个脚本,它从名为{number}.jpg的文件夹中获取.jpg图像,并将该数字乘以帧率与csv文件给定的范围进行比较。然后,jpg被复制到与csv相同的文件夹中,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
|---图像数据的去向
|--更多文件夹..
|-验证
|--与培训相同
|-测试
|--和培训一样

这是Python3。我在Ubuntu(Pop!OS)机器上运行VS代码。我已经尝试了适合这种情况的每个不同的
shutil
复制功能(
copy
copy2
copyfile
)。我试着复制到不同的文件夹,这很有效。如果我将文件复制到父文件夹(即,上面层次结构中的培训),而不是子目录,则工作正常。但是,我需要它们在子目录中用于标记目的

对于文件列表中的cur\u:
打开(当前,'r')作为img:
filename=ntpath.basename(cur)
frame_num=int(文件名[:-4])#从文件名获取编号
frame_num=(frame_num-1)*(30000./1001。)#视频中每帧的间隔为1秒
培训=获取文件夹(培训路径)
有关培训中的文件夹:
train\u csvfile=获取文件(train\u路径+文件夹)
如果len(序列csvfile)>0:
以open(train_csvfile[0],'r',encoding='latin-1',newline='''作为源:
train_reader=csv.reader(源,分隔符=',')
对于列车读卡器中的trdata:
如果frame_num>float(trdata[0]),frame_num
获取文件和文件夹的代码:

def get_文件夹(a_dir):
return[name for name in os.listdir(a_dir)
if os.path.isdir(os.path.join(a_dir,name))]
def get_文件(a_目录):
a_dir=路径(a_dir)
如果f.is_file(),则在_dir.glob('***')中为f返回[f]
文件列表=获取文件('/media/username/Seagate扩展驱动器/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
将000017.jpg复制到培训文件夹/home/username/Downloads/Event Data CSV/Data/training/CPR(COMPRESSION)/000017.jpg。
已将000018.jpg复制到培训文件夹/home/username/Downloads/Event Data CSV/Data/training/CPR(COMPRESSION)/000018.jpg。
已将000019.jpg复制到培训文件夹/home/username/Downloads/Event Data CSV/Data/training/CPR(COMPRESSION)/000019.jpg。
已将000021.jpg复制到培训文件夹/home/username/Downloads/Event Data CSV/Data/training/CPR(COMPRESSION)/000021.jpg。
回溯(最近一次呼叫最后一次):
文件“tfinput.py”,第39行,在
对于列车读卡器中的trdata:
_错误:行包含空字节
如前所述,文件已正确复制(但只有数百份中的四份)

在此脚本中,csv文件根本不会更改。脚本通过了四个图像,并因上述错误而崩溃。它正确地放置了这四个图像。如果我尝试在不重新生成数据的情况下再次运行脚本,它会立即崩溃。但是,如果我不使用copy函数,一切正常,所有正确的输入和输出目录都在我的print语句中给出。如果没有copy语句,也可以重新运行脚本而不重新生成。这让我觉得一定有某种覆盖问题,但由于我实际上没有编辑csv文件,所以我无法将手指放在上面

我希望它只需将文件从源复制到目标

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

编辑2:我能够通过使用
尝试来实现这一点,除了
块上的
块,该块以
开始,用于列读取器中的trdata:
但是它跳过了很多条目

edit3:对于那些好奇的人,我从来没有发现这个问题,尽管我怀疑这是一个覆盖问题,因为在没有copy语句的情况下检查NULL值不会产生任何结果。我重构了代码,首先创建了文件夹和文件名的文本文件,然后读取该文件并复制文件。那很好用


谢谢你的帮助

我认为这本书没有问题。从错误消息看,正在读取的CSV文件中似乎有空字节。写一些打印语句并观察该文件


你会发现这很有帮助

我认为这本书没有问题。从错误消息看,正在读取的CSV文件中似乎有空字节。写一些打印语句并观察该文件


你会发现这很有帮助

该错误表示其中一个csv文件中存在空字节。您是否尝试检查/打印文件名、行号或其他相关信息?。如果您搜索异常消息
\u csv.Error:行中包含空字节
,有许多问题和回答,可能其中一个是重复的。谢谢@wwii这帮了我的忙!我把我在答案里找到的答案贴了出来。打印文件名是调试的第一步