Cách đổi tên file trong python
Trong bài viết này, Quantrimang sẽ cùng bạn tìm hiểu về quản lý file và thư mục bằng Python, cụ thể là việc là tạo thư mục, đổi tên thư mục, liệt kê các thư mục và làm việc với chúng. Show Thư mục trong PythonỞ bài tìm hiểu trước, chúng ta đã làm quen với file và các thao tác làm việc với file trong Python. Ở đây bạn có thể hiểu đơn giản rằng thư mục là nơi chứa tất cả các file. Nên sắp xếp code cũng như file trong các thư mục khác nhau để dễ dàng quản lý mọi thứ. Python cũng cung cấp rất nhiều phương thức để xử lý các hoạt động đa dạng liên quan tới thư mục. Module os có được xây dựng để cung cấp các phương thức giúp bạn tạo, xóa, và thay đổi các thư mục. Hiển thị thư mục hiện tạiPhương thức getcwd() hiển thị thư mục đang làm việc hiện tại, trả về kết quả dưới dạng một chuỗi. Chúng ta cũng có thể sử dụng phương thức getcwdb() để nhận về kết quả dưới dạng byte. >>> import os>>> os.getcwd() 'C:\\Program Files\\PyScripter' >>> os.getcwdb() b'C:\\Program Files\\PyScripter' Thay đổi thư mục hiện tạiThư mục làm việc hiện tại có thể được thay đổi bằng phương thức chdir(). chdir() nhận một tham số là tên thư mục bạn muốn tới từ thư mục hiện tại. Có thể sử dụng cả dấu gạch chéo (/) hoặc dấu gạch chéo ngược (\) để tách các phần tử trong đường dẫn, nhưng tốt nhất vẫn nên sử dụng dấu gạch ngược (\). >>> os.chdir('C:\\Python33')>>> print(os.getcwd()) C:\Python33 Danh sách thư mục và fileBạn có thể liệt kê tất cả các tệp và thư mục con bên trong một thư mục bằng cách sử dụng phương thức listdir(). Phương thức này nhận một đường dẫn và trả về danh sách thư mục con và các file trong đường dẫn đó. Nếu không có đường dẫn nào được chỉ định, kết quả trả về sẽ truy xuất từ thư mục làm việc hiện tại. >>> print(os.getcwd())C:\Python33 >>> os.listdir() ['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'pythonw.exe', 'README.txt', 'Scripts', 'tcl', 'Tools'] >>> os.listdir('G:\\') ['$RECYCLE.BIN', 'Movies', 'Music', 'Photos', 'Series', 'System Volume Information'] Tạo một thư mục mớiĐể tạo các thư mục mới, bạn sử dụng phương thức mkdir() của Module os. Bạn có thể chọn nơi chứa thư mục mới bằng cách ghi đầy đủ đường dẫn tới nơi muốn tạo. Nếu đường dẫn đầy đủ không được chỉ định, thư mục mới sẽ được tạo trong thư mục làm việc hiện tại. >>> os.mkdir('test')>>> os.listdir() ['test'] Đổi tên thư mục hoặc tên fileBạn sử dụng phương thức rename() để đổi tên một thư mục hoặc một tập tin. >>> os.listdir()['test'] >>> os.rename('test','new_one') >>> os.listdir() ['new_one'] Xóa bỏ thư mục hoặc fileĐể gỡ bỏ một file, bạn sử dụng phương thức remove() Tương tự nhưng để xóa toàn bộ thư mục, sử dụng rmdir() >>> os.listdir()['new_one', 'old.txt'] >>> os.remove('old.txt') >>> os.listdir() ['new_one'] >>> os.rmdir('new_one') >>> os.listdir() [] Lưu ý rằng phương thức rmdir() chỉ có thể xóa các thư mục rỗng. Vậy để loại bỏ một thư mục không rỗng, chúng ta có thể sử dụng phương thức rmtree() bên trong module shutil. >>> os.listdir()['test'] >>> os.rmdir('test') Traceback (most recent call last): ... OSError: [WinError 145] The directory is not empty: 'test' >>> import shutil >>> shutil.rmtree('test') >>> os.listdir() [] Vậy là bạn đã làm quen được những thao tác cơ bản nhất với thư mục rồi. Module os trong Python vẫn còn cung cấp rất nhiều các phương thức hữu ích khác để thực hiện các hoạt động với file và thư mục nữa. Bạn hãy theo dõi trong những bài học tiếp theo của Quantrimang nhé. Chúc bạn học Python thật vui! Xem thêm:
Bài trước: Làm việc với File trong Python Bài tiếp: Error và Exception trong Python 10/22/2008 1:33:23 PMTrịnh Duy Cường · Trịnh Duy Cường 13:33 22/10/2008 Có cách nào dễ dàng để đổi tên một nhóm các tệp đã có trong một thư mục bằng Python không? Ví dụ: Tôi có một thư mục chứa đầy các tệp * .doc và tôi muốn đổi tên chúng theo cách nhất quán.
88 hữu ích 0 bình luận 150k xem chia sẻ answer Trịnh Vân Trang · Trịnh Vân Trang 18:59 22/10/2008 Việc đổi tên như vậy khá dễ dàng, ví dụ với các mô đun os và toàn cầu : import glob, os def rename(dir, pattern, titlePattern): for pathAndFilename in glob.iglob(os.path.join(dir, pattern)): title, ext = os.path.splitext(os.path.basename(pathAndFilename)) os.rename(pathAndFilename, os.path.join(dir, titlePattern % title + ext))Sau đó, bạn có thể sử dụng nó trong ví dụ của bạn như thế này: rename(r'c:\temp\xx', r'*.doc', r'new(%s)')Ví dụ trên sẽ chuyển đổi tất cả *.doccác tệp trong c:\temp\xxthư mục sang new(%s).doc, %stên cơ sở trước đó của tệp (không có phần mở rộng). 99 hữu ích 2 bình luận chia sẻ answer Phan Quế Phương · Phan Quế Phương 14:53 27/10/2011 Tôi thích viết một lớp lót nhỏ cho mỗi lần thay thế mà tôi phải làm thay vì tạo một mã chung và phức tạp hơn. Ví dụ: Điều này thay thế tất cả các dấu gạch dưới bằng dấu gạch nối trong bất kỳ tệp không bị ẩn nào trong thư mục hiện tại import os [os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]118 hữu ích 5 bình luận chia sẻ answer Bùi Tuấn Anh · Bùi Tuấn Anh 19:30 22/10/2008 Nếu bạn không phiền khi sử dụng các biểu thức thông thường, thì chức năng này sẽ cung cấp cho bạn nhiều sức mạnh trong việc đổi tên các tệp: import re, glob, os def renamer(files, pattern, replacement): for pathname in glob.glob(files): basename= os.path.basename(pathname) new_filename= re.sub(pattern, replacement, basename) if new_filename != basename: os.rename( pathname, os.path.join(os.path.dirname(pathname), new_filename))Vì vậy, trong ví dụ của bạn, bạn có thể làm (giả sử đó là thư mục hiện tại nơi chứa các tệp): renamer("*.doc", r"^(.*)\.doc$", r"new(\1).doc")nhưng bạn cũng có thể quay lại tên tập tin ban đầu: renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc")và hơn thế nữa. 21 hữu ích 0 bình luận chia sẻ answer Huỳnh Huyền Anh · Huỳnh Huyền Anh 09:46 04/12/2013 Tôi có điều này chỉ đơn giản là đổi tên tất cả các tệp trong thư mục con của thư mục import os def replace(fpath, old_str, new_str): for path, subdirs, files in os.walk(fpath): for name in files: if(old_str.lower() in name.lower()): os.rename(os.path.join(path,name), os.path.join(path, name.lower().replace(old_str,new_str)))Tôi đang thay thế tất cả các lần xuất hiện của old_str bằng bất kỳ trường hợp nào bằng new_str. 11 hữu ích 1 bình luận chia sẻ answer Lê Thăng Long · Lê Thăng Long 13:37 22/10/2008 Hãy thử: http://www.mattweber.org/2007/03/04/python-script-renamepy/
Mã nguồn của chương trình cũng có sẵn. 6 hữu ích 2 bình luận chia sẻ answer Đỗ Trường Sinh · Đỗ Trường Sinh 05:56 15/04/2012 Tôi đã tự viết một kịch bản python. Nó nhận làm đối số đường dẫn của thư mục chứa các tệp và mẫu đặt tên mà bạn muốn sử dụng. Tuy nhiên, nó đổi tên bằng cách đính kèm một số tăng (1, 2, 3, v.v.) vào mẫu đặt tên bạn đưa ra. import os import sys # checking whether path and filename are given. if len(sys.argv) != 3: print "Usage : python rename.pyHy vọng điều này làm việc cho bạn. 6 hữu ích 0 bình luận chia sẻ answer Hồ Mộng Vy · Hồ Mộng Vy 08:37 30/04/2017 directoryName = "Photographs" filePath = os.path.abspath(directoryName) filePathWithSlash = filePath + "\\" for counter, filename in enumerate(os.listdir(directoryName)): filenameWithPath = os.path.join(filePathWithSlash, filename) os.rename(filenameWithPath, filenameWithPath.replace(filename,"DSC_" + \ str(counter).zfill(4) + ".jpg" )) # e.g. filename = "photo1.jpg", directory = "c:\users\Photographs" # The string.replace call swaps in the new filename into # the current filename within the filenameWitPath string. Which # is then used by os.rename to rename the file in place, using the # current (unmodified) filenameWithPath. # os.listdir delivers the filename(s) from the directory # however in attempting to "rename" the file using os # a specific location of the file to be renamed is required. # this code is from Windows 2 hữu ích 0 bình luận chia sẻ answer Hoàng Mỹ Hân · Hoàng Mỹ Hân 21:15 18/10/2017 Tôi đã có một vấn đề tương tự, nhưng tôi muốn nối văn bản vào đầu tên tệp của tất cả các tệp trong một thư mục và sử dụng một phương pháp tương tự. Xem ví dụ dưới đây: folder = r"R:\mystuff\GIS_Projects\Website\2017\PDF" import os for root, dirs, filenames in os.walk(folder): for filename in filenames: fullpath = os.path.join(root, filename) filename_split = os.path.splitext(filename) # filename will be filename_split[0] and extension will be filename_split[1]) print fullpath print filename_split[0] print filename_split[1] os.rename(os.path.join(root, filename), os.path.join(root, "NewText_2017_" + filename_split[0] + filename_split[1]))2 hữu ích 0 bình luận chia sẻ answer Đỗ Yến Nhi · Đỗ Yến Nhi 21:43 03/09/2018 import os # get the file name list to nameList nameList = os.listdir() #loop through the name and rename for fileName in nameList: rename=fileName[15:28] os.rename(fileName,rename) #example: #input fileName bulk like :20180707131932_IMG_4304.JPG #output renamed bulk like :IMG_4304.JPG 2 hữu ích 1 bình luận chia sẻ answer Hồ Minh Nhật · Hồ Minh Nhật 11:59 17/08/2017 Đối với tôi trong thư mục của tôi, tôi có nhiều thư mục con, mỗi thư mục con có rất nhiều hình ảnh tôi muốn thay đổi tất cả các hình ảnh phụ thành 1.jpg ~ n.jpg def batch_rename(): base_dir = 'F:/ad_samples/test_samples/' sub_dir_list = glob.glob(base_dir + '*') # print sub_dir_list # like that ['F:/dir1', 'F:/dir2'] for dir_item in sub_dir_list: files = glob.glob(dir_item + '/*.jpg') i = 0 for f in files: os.rename(f, os.path.join(dir_item, str(i) + '.jpg')) i += 1(câu trả lời của riêng mys) https://stackoverflow.com/a/45734381/6329006 1 hữu ích 0 bình luận chia sẻ answer Ngô Hồng Oanh · Ngô Hồng Oanh 15:57 02/04/2018 # another regex version # usage example: # replacing an underscore in the filename with today's date # rename_files('..\\output', '(.*)(_)(.*\.CSV)', '\g<1>_20180402_\g<3>') def rename_files(path, pattern, replacement): for filename in os.listdir(path): if re.search(pattern, filename): new_filename = re.sub(pattern, replacement, filename) new_fullname = os.path.join(path, new_filename) old_fullname = os.path.join(path, filename) os.rename(old_fullname, new_fullname) print('Renamed: ' + old_fullname + ' to ' + new_fullname 1 hữu ích 0 bình luận chia sẻ answer Phan Minh Trung · Phan Minh Trung 04:46 09/01/2019 import glob2 import os def rename(f_path, new_name): filelist = glob2.glob(f_path + "*.ma") count = 0 for file in filelist: print("File Count : ", count) filename = os.path.split(file) print(filename) new_filename = f_path + new_name + str(count + 1) + ".ma" os.rename(f_path+filename[1], new_filename) print(new_filename) count = count + 1 0 hữu ích 0 bình luận chia sẻ Xem nguồn: https://stackoverflow.com//questions/225735/batch-renaming-of-files-in-a-directory |