将图片路径与标签路径拼接写入到txt文档

本文介绍了如何使用Python将图片的路径与对应的标签信息拼接,并将结果写入到TXT文档中。参考了一位老师的代码进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from pathlib import Path
if __name__ == '__main__':

    img_files = [
        Path("C:/Users/ytc79/Desktop/CrowdCounting-P2PNet-main/vis/part_B_final/train_data/images/")]#图片路径

    txt_files = [
        Path("C:/Users/ytc79/Desktop/CrowdCounting-P2PNet-main/vis/part_B_final/train_data/txt/")]#txt路径
    result_png_list = r"C:/Users/ytc79/Desktop/CrowdCounting-P2PNet-main/vis/part_B_final/train_data/train.txt"#要写到哪个文件中

    write_png = open(result_png_list, "w", encoding="utf-8")#打开要写入的txt文件
    for img_file, txt_file in zip(img_files, txt_files):
        for img_pth, txt_pth in list(zip(img_file.glob("IMG_*.jpg"), txt_file.glob("GT_IMG_*.txt"))):
        #我这里是IMG_开头的jpg和GT_IMG_开头的txt对应,如果只有后缀名不同,直接img_file.glob("*.jpg"), txt_file.glob("*.txt")即可
            write_png.write(str(img_pth) + "\x20" + str(txt_pth)+'\n')#路径拼接,加一个空格\x20,,再换行

    write_png.close()#关闭文件


结果如图所示:
在这里插入图片描述

参考了这位老师的代码:https://blog.youkuaiyun.com/xiangzun0155/article/details/128470042

<think>我们使用Java标准库中的Files.copy方法来实现文件复制,同时结合Path和Paths类来处理路径。 重命名可以在复制时直接指定新的文件名,也可以先复制再重命名,但更高效的做法是在复制时直接指定目标路径(包含新文件名)。 另外,如果目标目录不存在,我们需要先创建目录。 步骤: 1. 将源文件路径和目标文件路径转换为Path对象。 2. 检查目标目录是否存在,如果不存在则创建(包括所有必要的父目录)。 3. 使用Files.copy方法复制文件,在目标路径中可以直接指定新的文件名。 注意:如果目标文件已存在,默认情况下Files.copy会抛出FileAlreadyExistsException,我们可以通过指定复制选项来覆盖已存在的文件(使用StandardCopyOption.REPLACE_EXISTING)。 参考引用[1]中提到的错误:在复制之前先创建了目标文件,导致判断文件存在时总是为真,从而不执行复制。因此,我们不应该先创建文件,而是直接复制,并在复制时处理覆盖。 根据引用[3]的需求:将文件复制到新文件夹,如果文件夹不存在则创建,并重命名文件。 因此,我们可以设计一个方法,参数包括源文件路径字符串、目标目录路径字符串以及新的文件名(可选,如果不提供则使用原文件名)。 但是,为了灵活性,我们设计两个方法: 方法1:复制到指定目录,并指定新文件名(如果新文件名为空或null,则使用原文件名) 方法2:复制到指定目录,保持原文件名 但为了简单,我们只写一个方法,要求传入目标文件的完整路径(包括文件名)。这样用户就可以自由指定目标路径文件名。 方法签名: public static void copyFile(String sourcePath, String targetPath) throws IOException 其中targetPath可以是一个包含路径文件名的字符串,例如:"/new/path/newname.txt" 步骤: 1. 将源路径字符串转换为Path对象:Path source = Paths.get(sourcePath); 2. 将目标路径字符串转换为Path对象:Path target = Paths.get(targetPath); 3. 获取目标路径的父目录(即目标文件所在的目录),如果该目录不存在,则创建:Files.createDirectories(target.getParent()); 4. 复制文件,并覆盖已存在的文件:Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); 注意:如果源文件不存在,Files.copy会抛出NoSuchFileException。 下面我们编写完整的方法,并给出示例。 另外,根据引用[2],重命名也可以使用File.renameTo方法,但这里我们直接在复制时重命名,所以不需要单独重命名。 因此,实现如下:</think>### Java 实现复制文件到另一个路径并重命名的方法 在 Java 中实现文件复制和重命名操作,推荐使用 **NIO.2 API**(`java.nio.file` 包),它比传统的 `FileInputStream`/`FileOutputStream` 更高效且提供原子操作支持。以下是完整实现方法(参考引用内容优化[^1][^2][^3]): #### 方法实现 ```java import java.io.IOException; import java.nio.file.*; public class FileCopier { /** * 复制文件到新路径并重命名 * @param sourcePath 源文件路径(如 "C:/data/photo.jpg") * @param targetDir 目标目录路径(如 "D:/backup") * @param newFileName 新文件名(如 "vacation.jpg") * @return 复制后的完整路径(如 "D:/backup/vacation.jpg") */ public static String copyAndRenameFile(String sourcePath, String targetDir, String newFileName) throws IOException { // 1. 创建Path对象 Path source = Paths.get(sourcePath); Path targetDirectory = Paths.get(targetDir); Path targetFile = targetDirectory.resolve(newFileName); // 组合目录和文件名 // 2. 检查并创建目标目录(引用[^3]) if (!Files.exists(targetDirectory)) { Files.createDirectories(targetDirectory); // 递归创建目录 System.out.println("创建目录: " + targetDirectory); } // 3. 复制并重命名文件(引用[^1][^2]优化) Files.copy( source, targetFile, StandardCopyOption.REPLACE_EXISTING // 覆盖同名文件 ); return targetFile.toString(); } public static void main(String[] args) { try { // 示例:复制图片并重命名 String result = copyAndRenameFile( "C:/photos/original.jpg", "D:/archive/2023", "landscape.jpg" ); System.out.println("文件复制完成: " + result); } catch (IOException e) { e.printStackTrace(); } } } ``` #### 关键特性说明 1. **目录自动创建** `Files.createDirectories()` 会递归创建不存在的目录(参考引用[^3]的需求)。 2. **文件覆盖处理** `StandardCopyOption.REPLACE_EXISTING` 确保目标文件存在时自动覆盖(避免引用[^1]的空文件问题)。 3. **路径组合** `Path.resolve()` 方法安全组合目录和文件名(避免手动拼接路径分隔符错误)。 4. **原子操作** NIO.2 的复制操作是原子的,确保操作完整性。 #### 替代方案:传统 IO 方法 ```java // 使用 FileInputStream/FileOutputStream(适合小文件) public static void legacyCopy(String source, String target) throws IOException { Path targetPath = Paths.get(target); Files.createDirectories(targetPath.getParent()); // 创建父目录 try (InputStream in = new FileInputStream(source); OutputStream out = new FileOutputStream(target)) { byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } } } // 调用:legacyCopy("source.txt", "newdir/renamed.txt"); ``` #### 注意事项 1. **文件锁问题** 复制被其他进程锁定的文件会抛出 `AccessDeniedException`,需处理异常。 2. **符号链接** 默认复制符号链接指向的实际内容,使用 `NOFOLLOW_LINKS` 可复制链接本身: ```java Files.copy(source, target, LinkOption.NOFOLLOW_LINKS); ``` 3. **大文件优化** 处理大文件时,使用 `BufferedInputStream` 和 `BufferedOutputStream` 包装流提升性能: ```java try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(target))) { // ... 复制逻辑 } ``` 4. **元数据保留** 使用 `Files.copy()` 默认会复制基础属性(修改时间等),但需显式操作保留完整权限: ```java Files.copy(source, target, StandardCopyOption.COPY_ATTRIBUTES); ``` --- ### 常见问题解决 1. **如何复制整个目录?** 使用递归遍历 + `Files.walk()`: ```java Files.walk(sourceDir).forEach(source -> { Path target = targetDir.resolve(sourceDir.relativize(source)); Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); }); ``` 2. **如何保留原文件名只修改路径?** 提取源文件名组合新路径: ```java Path source = Paths.get("C:/data/file.txt"); String newPath = "D:/backup/" + source.getFileName(); // 保留原名 ``` 3. **如何批量重命名?** 结合正则表达式替换(参考引用[^2]): ```java String newName = oldName.replaceAll("\\d+", "seq"); // 替换数字为"seq" ``` --- ### 性能对比 | 方法 | 优点 | 缺点 | |--------------------|-------------------------------|--------------------------| | `Files.copy()` | 原子操作,支持元数据复制 | 不提供进度回调 | | 传统 IO 流 | 可自定义缓冲区大小,进度可控 | 需手动处理目录创建和关闭 | | Apache Commons IO | 单行代码实现(需额外依赖) | 增加项目依赖 | > 引用说明:本方法优化了文件创建时机(避免引用[^1]的空文件问题),支持目录自动创建(满足引用[^3]需求),并提供正则重命名扩展(参考引用[^2])。 --- ### 相关问题 1. 如何在复制文件时保留原始创建时间? 2. Java 如何实现文件夹的递归复制? 3. 复制大文件时如何显示进度条? 4. 如何处理复制过程中出现的文件权限问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值