输出文件名时Glob出错

时间:2018-03-19 22:02:31

标签: python python-3.x scripting-language

我在这里结合了两个问题,因为它们彼此相关。

问题1:我正在尝试使用glob来打开文件夹中的所有文件,但它正在给我"语法错误"。我使用的是Python 3.xx. Python 3.xx的语法是否已更改?

错误讯息:

File "multiple_files.py", line 29
files = glob.glob(/src/xyz/rte/folder/)

SyntaxError: invalid syntax

代码:

import csv
import os
import glob
from pandas import DataFrame, read_csv

    #extracting
files = glob.glob(/src/xyz/rte/folder/)
for fle in files:
    with open (fle) as f:
        print("output" + fle)                   
f_read.close()

问题2:我想读取输入文件,追加"输出"到名称并打印出文件的名称。我怎么能这样做?

示例:输入文件名为 - xyz.csv,代码应打印output_xyz.csv。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您的第一个问题是字符串(包括路径名)需要在引号中。这样:

files = glob.glob(/src/xyz/rte/folder/)

...试图将一堆变量分开,但最左边和最右边的分区都缺少操作数,所以你混淆了解析器。你想要的是这个:

files = glob.glob('/src/xyz/rte/folder/')

你的下一个问题是这个glob模式中没有任何glob,所以它唯一匹配的就是目录本身。

这是完全合法的,但有点无用。

然后您尝试将每个匹配项打开为文本文件。你不能对目录做什么,因此IsADirectoryError

这里的答案不太明显,因为不清楚你想要什么。

  • 也许您只是想要该目录中的所有文件?在这种情况下,您不希望glob.globlistdir(或scandir}:os.listdir('/src/xyz/rte/folder/')。{/ p>

  • 也许你想要该目录或其任何子目录中的所有文件?在这种情况下,您可以使用rglob执行此操作,但os.walk可能更清晰。

  • 也许您确实希望该目录中的所有文件都与某个模式匹配,因此glob.glob是正确的 - 但在这种情况下,您需要指定该模式是什么。例如,如果您想要所有.csv个文件,那就是glob.glob('/src/xyz/rte/folder/*.csv')

最后,你说“我想读取输入文件,将”输出“附加到名称并打印出文件的名称”。如果你没有对内容做任何事情,你为什么要阅读文件?当然,你可以做到这一点,但这看起来很浪费。如果您只想打印出附加了输出的文件名,那很简单:

for filename in os.listdir('/src/xyz/rte/folder/'):
    print('output'+filename)

答案 1 :(得分:0)

这适用于http://pyfiddle.io

Doku:https://docs.python.org/3/library/glob.html

import csv
import os
import glob 

# create some files
for n in ["a","b","c","d"]:
    with open('{}.txt'.format(n),"w") as f:
        f.write(n) 

print("\nFiles before")

# get all files
files = glob.glob("./*.*")

for fle in files:
    print(fle)      # print file
    path,fileName = os.path.split(fle)  # split name from path

    # open file for read and second one for write with modified name
    with open (fle) as f,open('{}{}output_{}'.format(path,os.sep, fileName),"w") as w:
        content = f.read()            # read all
        w.write(content.upper())      # write all modified

# check files afterwards
print("\nFiles after")
files = glob.glob("./*.*")  # pattern for all files
for fle in files:
    print(fle)                              

输出:

Files before
./d.txt
./main.py
./c.txt
./b.txt
./a.txt

Files after
./d.txt
./output_c.txt
./output_d.txt
./main.py
./output_main.py
./c.txt
./b.txt
./output_b.txt
./a.txt
./output_a.txt

我在Windows上,而是使用os.walk (Doku)代替。

for d,subdirs,files in os.walk("./"): # deconstruct returned aktDir, all subdirs, files
    print("AktDir:", d)
    print("Subdirs:", subdirs)
    print("Files:", files)

Output:

AktDir: ./
Subdirs: []
Files: ['d.txt', 'output_c.txt', 'output_d.txt', 'main.py', 'output_main.py', 
        'c.txt', 'b.txt', 'output_b.txt', 'a.txt', 'output_a.txt'] 

它也会进入子目录。