在Python中,如何通过glob迭代长路径名并读取Windows中的所有文件?

问题描述 投票:0回答:1

我正在尝试编写一个Python脚本,其中使用glob来获取文件路径列表,然后通过pd.read_csv()读取它们以生成一个大数据框。该脚本在 Mac 上运行良好。然而,我试图帮助一位同事在他们的 PC 上的 Jupyter Notebook 中运行这个程序,但一直失败。

Mac 脚本很简单。只是:

df = pd.DataFrame()

subfolders = ['sub1', 'sub2', 'sub3']

for sub in subfolders:
        for filePath in glob.glob('/server/folder1/folder2/'+sub+'/*/*/*/*/*/*/lastfolder/*output.txt'):
                df2 = pd.read_csv(filePath, sep='\t')
                df = pd.concat([df, df2])

他们过去运行过类似的脚本,没有任何问题。但是,该路径长度现在大于 >260 个字符,我认为这导致了问题。

对于长路径,Windows 在前面添加了一点(...出于什么原因?),例如: \?\UNC\服务器\共享\目录...

当我尝试读取带有附加“\?\UNC”部分的路径时,它破坏了东西。通常我告诉他们只需将反斜杠更改为正斜杠,但这在这里不起作用(我确信有更好的方法可以做到这一点,但这确实不是我工作的重要部分 - 我是只是想让事情更有效地运行)。

我真的不知道如何处理 Windows,所以每次我尝试帮助他们都是一次冒险。我尝试询问 ChatGPT,它让我找到了这个解决方案:

# Define the UNC path with the long path prefix
long_unc_path = r'\\?\UNC\server\folder1\folder2\'


# Convert the long UNC path to a Path object
new_path = Path(long_unc_path)

df = pd.DataFrame()

subfolders = ['sub1', 'sub2', 'sub3']

for sub in subfolders:
        for filePath in glob.glob(new_path+sub+'/*/*/*/*/*/*/lastfolder/*output.txt'):
                df2 = pd.read_csv(filePath, sep='\t')
                df = pd.concat([df, df2])

但是 long_unc_path 的第一行给了我一个未终止的字符串文字错误。我确信这是一个简单的解决方案,但我不知道它是什么。我们正在使用 Python 3.11。

有人可以帮忙吗?谢谢!

python pandas windows unc
1个回答
0
投票

这是因为原始字符串并不像您想象的那样完全原始,它们可能会导致

unterminated string literal
错误。在您的情况下,字符串末尾的最后一个
\
尝试充当转义字符并转义
'
。所以它找不到字符串的结尾并导致问题。如果字符串末尾需要有
\
,可以将其定义为普通字符串并将其添加到路径末尾:

long_unc_path = r'\\?\UNC\server\folder1\folder2' +'\\'
© www.soinside.com 2019 - 2024. All rights reserved.