Hướng dẫn double backslash python filepath - dấu gạch chéo ngược kép đường dẫn tệp python

Backslash kép không sai, Python đại diện cho nó theo cách cho người dùng. Trong mỗi dấu gạch chéo ngược đôi \\, người đầu tiên thoát khỏi cái thứ hai để ngụ ý một dấu gạch chéo ngược thực tế. Nếu a = r'raw s\tring'b = 'raw s\\tring' (không 'R' và chém đôi rõ ràng) thì cả hai đều được đại diện là ____10.

>>> a = r'raw s\tring'
>>> b = 'raw s\\tring'
>>> a
'raw s\\tring'
>>> b
'raw s\\tring'

Để làm rõ, khi bạn in chuỗi, bạn sẽ thấy nó như nó sẽ được sử dụng, giống như trong một đường dẫn - chỉ với một dấu gạch chéo ngược:

>>> print(a)
raw s\tring
>>> print(b)
raw s\tring

Và trong trường hợp chuỗi in này,

>>> print(a)
raw s\tring
>>> print(b)
raw s\tring
1 không ngụ ý một tab, đó là một dấu gạch chéo ngược
>>> print(a)
raw s\tring
>>> print(b)
raw s\tring
2 theo sau là chữ 't'.

Mặt khác, một chuỗi không có tiền tố 'r' và một dấu gạch chéo ngược sẽ thoát khỏi ký tự sau nó, khiến nó đánh giá 'T' theo nó == tab:

>>> t = 'not raw s\tring'  # here '\t' = tab
>>> t
'not raw s\tring'
>>> print(t)  # will print a tab (and no letter 't' in 's\tring')
not raw s       ring

Vì vậy, trong đường dẫn PDF+Tên:

>>> item = 'xyz'
>>> PDF = r'C:\Users\user\Desktop\File_%s.pdf' % item
>>> PDF         # the representation of the string, also in error messages
'C:\\Users\\user\\Desktop\\File_xyz.pdf'
>>> print(PDF)  # "as used"
C:\Users\user\Desktop\File_xyz.pdf

Thông tin thêm về trình tự thoát trong bảng ở đây. Cũng xem

>>> print(a)
raw s\tring
>>> print(b)
raw s\tring
3 so với
>>> print(a)
raw s\tring
>>> print(b)
raw s\tring
4.

Tôi đang kết hợp một filepath để mở một hình ảnh với plt.imshow () như sau:

from pathlib import Path
import numpy as np 
import pandas as pd
from scipy.io import loadmat
import pprint
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import os

folder = Path('D:\ ... \emotic') 
    #Note that \ ... \ stands for my filepath
original_database = Path(annotations_dict['train']['original_database'][0][50][0][0][0][0])
filename = Path(annotations_dict['train']['filename'][0][50][0])

image_path = os.path.join(folder, original_database, 'images', filename)

img = mpimg.imread(image_path)
imgplot = plt.imshow(img)
plt.show()

print(image_path)
print(repr(image_path))

Nhưng tôi liên tục nhận được thông báo lỗi sau: UniCentifiedImageError*: Không thể xác định tệp hình ảnh 'd: \\ ... \\ ... \\ ... \\ ... \\ ... \ 'hình ảnh \\ frame_aztc78d4kjclxv9e.jpg'**UnidentifiedImageError*: cannot identify image file 'D:\\ ... \\ ... \\ ... \\ ... \\ ... \\emotic\\framesdb\\images\\frame_aztc78d4kjclxv9e.jpg'*

Vì vậy, rõ ràng nó không thể đọc FilePath vì tất cả các dấu gạch chéo ngược được nhân đôi. Tôi đã tìm thấy nhiều bài viết trực tuyến giải thích lý do tại sao điều này xảy ra (\ là một nhân vật thoát), nhưng không ai giải thích cách giải quyết vấn đề này. Làm cách nào để thực thi rằng filePath được truyền vào hàm plt.imshow () chỉ chứa dấu gạch chéo ngược? Tôi đã thử giải quyết vấn đề này bằng các phương pháp sau:why this happens (\ is an escape character), but none explaining how to solve this. How do I enforce that the filepath passed on to the plt.imshow() function contains only single backslashes? I've tried solving this issue using the following methods:

  • OS.Path.NormPath (...) ==> Không làm gì;

  • Image_path.replace ('\\', '\') ==> cũng không làm gì cả;

  • Sử dụng r '...' để thực thi một chuỗi thô với các dấu gạch chéo đơn ==> vẫn không làm gì cả.

Cũng lưu ý rằng in (Image_Path) cung cấp cho FilePath với các dấu gạch chéo ngược, trong khi in (repr (Image_path)) cung cấp cho FilePath với các dấu gạch chéo ngược. Và tôi có được sự khác biệt và tại sao điều này là (loại). Nhưng tôi không biết làm thế nào để truyền một trong những dấu gạch chéo ngược cho plt.imshow () và mọi phương pháp tôi thử kết thúc cho tôi lỗi "chém đôi" giống nhau.

Bất kỳ sự giúp đỡ nào cũng được đánh giá cao: D

EDIT 1: FilePath có tên trong thông báo lỗi là chính xác. Nếu tôi lấy FilePath đó và thay thế tất cả các dấu gạch chéo bằng cách cắt một lần, sau đó đặt nó vào trình khám phá tệp của tôi, hình ảnh chính xác sẽ xuất hiện. : The filepath named in the error message is correct. If I take that filepath and replace all the double slashes by single slashes, then put this into my file explorer, the correct image comes up.

EDIT 2 [Đã giải quyết]: Hóa ra lỗi không phải do các dấu gạch chéo ngược lại so với gấp đôi trong filePath, mà là một vấn đề với hàm matplotlib.image.imread () vì lý do nào đó không thể truy cập cơ sở dữ liệu hình ảnh của tôi và kích hoạt lỗi. Nếu tôi sử dụng trình đọc hình ảnh từ thư viện PIL thay thế, mọi thứ đều hoạt động tốt: [SOLVED] : Turns out the error wasn't due to single vs. double backslashes in the filepath, but rather to a problem with the matplotlib.image.imread() function that for some reason can't access my image database and triggers the error. If I use an image reader from the PIL library instead, everything works fine:

Đã giải quyết bằng cách sử dụng điều này:

from PIL import Image
plt.imshow(Image.open(image_path))

Thay vì điều này:

plt.imshow(mpimg.imread(image_path))

Cảm ơn tất cả mọi người đã giúp tôi cô lập vấn đề!

Tôi đang phải đối mặt với một vấn đề rất cơ bản bằng cách sử dụng đường dẫn thư mục trong tập lệnh Python. Khi tôi sao chép đường dẫn từ Windows Explorer, nó sử dụng chém lùi làm máy cắt đường dẫn đang gây ra vấn đề.

>>> x 'd: \ testFolder' >>> in x d: estFolder >>> in os.path.normpath [x] d: estFolder >>> in os.path.abspath [x] d: \ estFolder> >> in x.replace ['\\', '/' '] d: estFolder

Một số người có thể giúp tôi khắc phục điều này.

Hỏi ngày 28 tháng 9 năm 2013 lúc 8:49Sep 28, 2013 at 8:49

2

Python diễn giải a \ t trong một chuỗi làm ký tự tab; Do đó, "D: \ testFolder" sẽ in ra bằng một tab giữa: và E, như bạn nhận thấy. Nếu bạn muốn một dấu gạch chéo ngược thực tế, bạn cần thoát khỏi dấu gạch chéo ngược bằng cách nhập nó dưới dạng \\:

>>> x = "D: \\ testFolder" >>> in x d: \ testFolder

Tuy nhiên, để tương thích đa nền tảng, có lẽ bạn nên sử dụng Os.Path.Join. Tôi nghĩ rằng Python trên Windows cũng sẽ tự động xử lý các dấu gạch chéo về phía trước [/] cũng đúng.

Đã trả lời ngày 28 tháng 9 năm 2013 lúc 8:57Sep 28, 2013 at 8:57

Mipadimipadimipadi

386K88 Huy hiệu vàng515 Huy hiệu bạc475 Huy hiệu Đồng88 gold badges515 silver badges475 bronze badges

4

Một trong những phiền toái của chương trình, Microsoft Windows sử dụng ký tự dấu gạch chéo ngược giữa các tên thư mục trong khi hầu hết mọi máy tính khác đều sử dụng dấu gạch chéo phía trước:

Đây là một tai nạn của lịch sử máy tính đầu năm 1980. Phiên bản đầu tiên của MS-DOS đã sử dụng ký tự Slash chuyển tiếp để chỉ định các tùy chọn dòng lệnh. Khi Microsoft thêm hỗ trợ cho các thư mục trong MS-DOS 2.0, nhân vật chém phía trước đã được thực hiện để họ sử dụng dấu gạch chéo ngược. Ba mươi lăm năm sau, chúng tôi vẫn bị mắc kẹt với sự không tương thích này.

Nếu bạn muốn mã Python của mình hoạt động trên cả Windows và Mac/Linux, bạn sẽ cần phải giải quyết các loại vấn đề dành riêng cho nền tảng này. May mắn thay, Python 3 có một mô -đun mới có tên Pathlib làm cho làm việc với các tệp gần như không đau.pathlib that makes working with files nearly painless.

Hãy cùng xem nhanh các cách xử lý các đường dẫn tên tệp khác nhau và xem Pathlib có thể làm cho cuộc sống của bạn tốt hơn như thế nào!pathlib can make your life better!

Giải pháp sai: Xây dựng đường dẫn tệp bằng tay

Hãy nói rằng bạn có một thư mục dữ liệu chứa một tệp mà bạn muốn mở trong chương trình Python của mình:

Đây là cách sai để mã hóa nó trong Python:

Lưu ý rằng tôi đã mã hóa đường dẫn bằng cách sử dụng dấu gạch chéo về phía trước theo kiểu Unix kể từ khi tôi trên máy Mac. Điều này sẽ khiến người dùng Windows tức giận.

Về mặt kỹ thuật, mã này vẫn sẽ hoạt động trên Windows vì Python có một hack nơi nó sẽ nhận ra một trong hai loại chém khi bạn gọi mở [] trên Windows. Nhưng thậm chí vẫn còn, bạn không nên phụ thuộc vào điều đó. Không phải tất cả các thư viện Python sẽ hoạt động nếu bạn sử dụng sai loại chém trên hệ điều hành sai - đặc biệt nếu chúng giao tiếp với các chương trình hoặc thư viện bên ngoài.open[] on Windows. But even still, you shouldn’t depend on that. Not all Python libraries will work if you use wrong kind of slash on the wrong operating system — especially if they interface with external programs or libraries.

Và sự hỗ trợ của Python, để trộn các loại chém là một hack chỉ có Windows không hoạt động ngược lại. Sử dụng dấu gạch chéo ngược trong mã sẽ hoàn toàn thất bại trên máy Mac:

Vì tất cả những lý do này và hơn thế nữa, viết mã với chuỗi đường dẫn được mã hóa cứng là loại điều sẽ khiến các lập trình viên khác nhìn bạn với sự nghi ngờ lớn. Nói chung, bạn nên cố gắng tránh nó.

Giải pháp cũ: Mô -đun Python từ OS.Path

Mô-đun Python sườn OS.PATH có rất nhiều công cụ để làm việc xung quanh các loại vấn đề hệ thống tập tin cụ thể của hệ điều hành.os.path module has lots of tools for working around these kinds of operating system-specific file system issues.

Bạn có thể sử dụng Os.Path.Join [] để xây dựng chuỗi đường dẫn bằng cách sử dụng đúng loại chém cho hệ điều hành hiện tại:os.path.join[] to build a path string using the right kind of slash for the current operating system:

Mã này sẽ hoạt động hoàn hảo trên cả Windows hoặc Mac. Vấn đề là nó là một nỗi đau để sử dụng. Viết ra Os.Path.Join [] và đi qua từng phần của đường dẫn dưới dạng một chuỗi riêng biệt là tồi tệ và không trực quan.os.path.join[] and passing in each part of the path as a separate string is wordy and unintuitive.

Vì hầu hết các chức năng trong mô -đun OS.Path cũng gây khó chịu tương tự khi sử dụng, các nhà phát triển thường quên quên sử dụng chúng ngay cả khi họ biết rõ hơn. Điều này dẫn đến rất nhiều lỗi đa nền tảng và người dùng tức giận.os.path module are similarly annoying to use, developers often “forget” to use them even when they know better. This leads to a lot of cross-platform bugs and angry users.

Giải pháp tốt hơn: Python 3 Pathlib!

Python 3.4 đã giới thiệu một thư viện tiêu chuẩn mới để xử lý các tệp và đường dẫn được gọi là pathlib - và nó rất tuyệt!pathlib — and it’s great!

Để sử dụng nó, bạn chỉ cần chuyển một đường dẫn hoặc tên tệp vào một đối tượng đường dẫn mới [] bằng cách sử dụng dấu gạch chéo về phía trước và nó xử lý phần còn lại:

Lưu ý hai điều ở đây:

  1. Bạn nên sử dụng dấu gạch chéo về phía trước với các hàm pathlib. Đối tượng đường dẫn [] sẽ chuyển đổi các vết chém về phía trước thành đúng loại chém cho hệ điều hành hiện tại. Tốt đẹp!pathlib functions. The Path[] object will convert forward slashes into the correct kind of slash for the current operating system. Nice!
  2. Nếu bạn muốn thêm vào đường dẫn, bạn có thể sử dụng / toán tử trực tiếp trong mã của mình. Nói lời tạm biệt để gõ ra os.path.join [a, b] nhiều lần./ operator directly in your code. Say goodbye to typing out os.path.join[a, b] over and over.

Và nếu đó là tất cả các pathlib đã làm, nó sẽ là một bổ sung tốt đẹp cho Python - nhưng nó làm nhiều hơn nữa!pathlib did, it would be a nice addition to Python — but it does a lot more!

Ví dụ: chúng ta có thể đọc nội dung của tệp văn bản mà không cần phải mở và đóng tệp:

Pro-tip: Các ví dụ trước là lỗi vì tệp đã mở không bao giờ được đóng. Cú pháp này tránh được lỗi đó hoàn toàn.

Trên thực tế, Pathlib làm cho hầu hết các hoạt động tệp tiêu chuẩn nhanh chóng và dễ dàng:pathlib makes most standard file operations quick and easy:

Bạn thậm chí có thể sử dụng pathlib để chuyển đổi một cách rõ ràng đường dẫn UNIX thành đường dẫn có định dạng Windows:pathlib to explicitly convert a Unix path into a Windows-formatted path:

Và nếu bạn thực sự muốn sử dụng dấu gạch chéo ngược trong mã của mình một cách an toàn, bạn có thể khai báo đường dẫn của mình vì Windows-smormatted và Pathlib có thể chuyển đổi nó để hoạt động trên hệ điều hành hiện tại:pathlib can convert it to work on the current operating system:

Nếu bạn muốn có được ưa thích, bạn thậm chí có thể sử dụng pathlib để thực hiện những việc như giải quyết các đường dẫn tệp tương đối, đường dẫn chia sẻ mạng Parse và tạo tệp: // URL. Dưới đây, một ví dụ sẽ mở một tệp cục bộ trong trình duyệt web của bạn chỉ bằng hai dòng một mã:pathlib to do things like resolve relative file paths, parse network share paths and generate file:// urls. Here’s an example that will open a local file in your web browser with just two lines a code:

Đây chỉ là một đỉnh nhỏ ở Pathlib. Nó là một sự thay thế tuyệt vời cho nhiều chức năng liên quan đến tệp khác nhau được sử dụng để phân tán xung quanh các mô-đun Python khác nhau. Kiểm tra nó ra!pathlib. It’s a great replacement for lots of different file-related functionality that used to be scattered around different Python modules. Check it out!

Làm thế nào để bạn thoát khỏi một dấu gạch chéo ngược trong Python?

Cuối cùng, "\" có thể được sử dụng để thoát khỏi chính nó: "\\" là ký tự dấu gạch chéo ngược theo nghĩa đen. Có hàng tấn các hàm tiện dụng được xác định trên các chuỗi, được gọi là các phương thức chuỗi."\" can be used to escape itself: "\\" is the literal backslash character. There are tons of handy functions that are defined on strings, called string methods.

Làm thế nào để bạn thoát khỏi một dấu gạch chéo trên con đường?

Về việc thoát các ký tự đường dẫn tệp được thoát ra bao gồm dấu gạch chéo ngược [\, bởi vì đó là ký tự thoát] và các trích dẫn kép ["]. Cả hai ký tự này có thể có liên quan trong các đường dẫn tệp.include the backslash [\, because it is the escaping character] and the double quotes ["]. Both of these characters can be relevant in file paths.

Python có sử dụng dấu gạch chéo ngược hoặc chém về phía trước không?

Ngôn ngữ lập trình, chẳng hạn như Python, coi một dấu gạch chéo ngược [\] là một nhân vật thoát. Chẳng hạn, \ n đại diện cho nguồn cấp dữ liệu và \ t đại diện cho một tab. Khi chỉ định một đường dẫn, một dấu gạch chéo về phía trước [/] có thể được sử dụng thay cho một dấu gạch chéo ngược. Hai dấu gạch chéo ngược có thể được sử dụng thay vì một để tránh lỗi cú pháp.When specifying a path, a forward slash [/] can be used in place of a backslash. Two backslashes can be used instead of one to avoid a syntax error.

Làm thế nào để bạn vượt qua một con đường trong Python?

Để sử dụng nó, bạn chỉ cần chuyển một đường dẫn hoặc tên tệp vào một đối tượng đường dẫn mới [] bằng cách sử dụng dấu gạch chéo về phía trước và nó xử lý phần còn lại: Lưu ý hai điều ở đây: bạn nên sử dụng dấu gạch chéo về phía trước với các hàm pathlib. Đối tượng đường dẫn [] sẽ chuyển đổi các vết chém về phía trước thành đúng loại chém cho hệ điều hành hiện tại.pass a path or filename into a new Path[] object using forward slashes and it handles the rest: Notice two things here: You should use forward slashes with pathlib functions. The Path[] object will convert forward slashes into the correct kind of slash for the current operating system.