ฉันต้องการที่จะเปลี่ยนไปa.txt
b.kml
ฉันต้องการที่จะเปลี่ยนไปa.txt
b.kml
คำตอบ:
การใช้os.rename
:
import os
os.rename('a.txt', 'b.kml')
C:/folder/file.txt
บน Windows หรือ/home/file.txt
Linux / MacOS)
OSError
ในระบบ Windows os.path.exists
ควรใช้เพื่อตรวจสอบว่ามีเป้าหมายอยู่ก่อนการเปลี่ยนชื่อหรือไม่ สิ่งนี้จะสร้างบั๊ก "เวลาในการตรวจสอบกับเวลาใช้งาน" แต่ก็ไม่น่าจะทำให้เกิดปัญหา (ฉันรู้ว่าไม่มีวิธีง่ายๆรอบนี้ - ดูที่นี่ .
os.replace
ไฟล์อาจอยู่ในไดเรกทอรีในกรณีนั้นให้ระบุเส้นทาง:
import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)
import shutil
shutil.move('a.txt', 'b.kml')
สิ่งนี้จะทำงานเพื่อเปลี่ยนชื่อหรือย้ายไฟล์
shutil.move
ไม่ใช่ตัวเลือกที่ดีเนื่องจากไม่มีการใช้งานแบบปรมาณู ตัวอย่างเช่นหากไฟล์เปิดอยู่shutil.move
จะสร้างไฟล์ด้วยnew_name
แต่จะไม่ลบไฟล์ด้วยold_name
เหตุนี้จึงทำให้คุณมีสองไฟล์ os.rename
บนมืออื่น ๆ จะทำอะไรซึ่งเป็นตัวเลือกที่ดี ด้วยshutil.move
แม้ว่าคุณจะจับข้อผิดพลาดคุณยังจะต้องกังวลเกี่ยวกับการตรวจสอบและลบไฟล์โกง ก็ไม่คุ้มค่าเมื่อเป็นเครื่องมือที่ดีกว่าที่มีอยู่: os.rename
ในฐานะของ Python 3.4 เราสามารถใช้โมดูลpathlibเพื่อแก้ปัญหานี้ได้
หากคุณอยู่ในเวอร์ชันที่เก่ากว่าคุณสามารถใช้เวอร์ชัน backported ได้ที่นี่
สมมติว่าคุณไม่ได้อยู่ในเส้นทางราก (เพียงเพิ่มความยากนิดหน่อย) คุณต้องการเปลี่ยนชื่อและต้องระบุเส้นทางแบบเต็มเราสามารถดูได้ที่:
some_path = 'a/b/c/the_file.extension'
ดังนั้นคุณสามารถใช้เส้นทางของคุณและสร้างPath
วัตถุจากมัน:
from pathlib import Path
p = Path(some_path)
เพียงเพื่อให้ข้อมูลบางอย่างเกี่ยวกับวัตถุนี้ที่เรามีตอนนี้เราสามารถแยกสิ่งต่าง ๆ ออกมาจากวัตถุ ตัวอย่างเช่นถ้าด้วยเหตุผลใดก็ตามที่เราต้องการเปลี่ยนชื่อไฟล์โดยการแก้ไขชื่อไฟล์จากthe_file
เป็นthe_file_1
แล้วเราจะได้รับส่วนชื่อไฟล์:
name_without_extension = p.stem
และยังคงมีส่วนขยายอยู่ในมือเช่นกัน:
ext = p.suffix
เราสามารถทำการแก้ไขด้วยการจัดการสตริงอย่างง่าย ๆ :
Python 3.6 และสูงกว่าใช้ประโยชน์จาก f-strings!
new_file_name = f"{name_without_extension}_1"
มิฉะนั้น:
new_file_name = "{}_{}".format(name_without_extension, 1)
และตอนนี้เราสามารถทำการเปลี่ยนชื่อของเราได้โดยการเรียกใช้rename
เมธอดบนวัตถุพา ธ ที่เราสร้างและต่อท้ายext
เพื่อทำให้โครงสร้างการเปลี่ยนชื่อที่เหมาะสมที่เราต้องการ:
p.rename(Path(p.parent, new_file_name + ext))
อีกไม่นานเพื่อแสดงความเรียบง่าย:
Python 3.6+:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))
รุ่นที่น้อยกว่า Python 3.6 ใช้วิธีการจัดรูปแบบสตริงแทน:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
pathlib
มีการแนะนำไลบรารี่ใน python 3.4 เพื่อแบ่งปันคำตอบที่นี่นอกจากนี้ยังมีการเปิดรับโมดูลที่เป็นของแข็งเพื่อแสดงความเก่งกาจและการใช้งานสำหรับความต้องการที่ซับซ้อนมากขึ้น
{}
สำหรับสตริงการจัดรูปแบบซึ่งคุณสามารถอ่านข้อมูลเกี่ยวกับที่นี่ ในที่สุดสิ่งที่เกิดขึ้นคือการ{}
แทนที่ด้วยตัวแปรที่ส่งผ่านไปยังformat
วิธีการ ดังนั้นก่อนที่{}
จะถือสิ่งที่อยู่ในและที่สองจะถืออาร์กิวเมนต์ที่สองซึ่งเป็นเพียงname_without_extension
1
os.rename(old, new)
พบได้ใน Python docs: http://docs.python.org/library/os.html
os.rename
ใช้ แต่คุณต้องผ่านเส้นทางแบบเต็มของไฟล์ทั้งสองไปยังฟังก์ชั่น หากฉันมีไฟล์a.txt
บนเดสก์ท็อปของฉันฉันจะทำและฉันก็ต้องให้ไฟล์ที่ถูกเปลี่ยนชื่อด้วยเช่นกัน
os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
import os
# Set the path
path = 'a\\b\\c'
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in
os.chdir(saved_cwd)
chdir()
ไปยังไดเรกทอรีได้เสมอเช่นเกิดอะไรขึ้นภายใต้ Windows เมื่อเป็น UNC และการทำchdir()
มีผลข้างเคียง ฉันต้องการเพียงระบุเส้นทางที่จำเป็นในการos.rename()
โดยตรงไม่มีchdir()
ไอเอ็นจี
คุณสามารถใช้ os.system เพื่อเรียกใช้งานเทอร์มินัลเพื่อให้งานสำเร็จ:
os.system('mv oldfile newfile')
mv
เป็นโปรแกรม commandline unix ในตัวเพื่อย้าย / เปลี่ยนชื่อไฟล์
import os
import re
from pathlib import Path
for f in os.listdir(training_data_dir2):
for file in os.listdir( training_data_dir2 + '/' + f):
oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
p=oldfile
p.rename(newfile)
os.path
กับความทันสมัยpathlib
ค่อนข้างแน่นอน ไปตลอดทางด้วยpathlib
แทน
import shutil
import os
files = os.listdir("./pics/")
for key in range(0, len(files)):
print files[key]
shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")
สิ่งนี้ควรทำ หลาม 3+