I'm writing a program that scans for specific file types and reads them for certain 'commands'. I have the code
filenameglob = (glob.glob("*.doremi"))
but upon returning the variable with print
it comes out as ['test.doremi']
instead of the optimal test.doremi
. The problem with this is I can not use it to read the file. How would I go about using glob to search for the file, output the name and then read the file with that name?

- 11
- 4
-
Does this answer your question? [Getting only element from a single-element list in Python?](https://stackoverflow.com/questions/33161448/getting-only-element-from-a-single-element-list-in-python) – framontb Jul 27 '20 at 12:00
1 Answers
Basic Answer
glob.glob
returns a list of items matching the search criteria passed at runtime- or an empty list if no matches are found. This is why you are getting ['test.doremi']
instead of test.doremi
.
The filenameglob
variable in your example is a list containing 1 element - the string test.doremi
- which can be accessed using it's index within the list i.e filenameglob[0]
is test.doremi
.
The below code provides an appropriate answer/solution to your original question assuming that there will be 0 or 1 .doremi
files in the target directory.
import glob
filenameglob = glob.glob("*.doremi")
if filenameglob: # If glob.glob returned list of matches
filename = filenameglob[0] # Take first item from filename glob
print(filename)
with open(filename, "r") as f: # Open file in read mode
contents = f.read() # Read contents from file to variable
# Do something with contents read from .doremi file
else: # Else if glob.glob returned empty list
print("No .doremi file found!")
# Define behaviour in case of no .doremi file found
Processing multiple .doremi
files from directory
The above code assumes 0 or 1 files with the .doremi
extension within the execution directory as per your original question.
As described above, glob.glob
returns a list of strings representing matches based on the arguments passed to the function at runtime - in this case '*.doremi'
.
Therefore it is probably worth considering how you will handle multiple .doremi
files should they be found within the execution directory by glob.glob
.
One solution may be to write a function that defines how you will handle contents read from each .doremi
file and call this within a loop for each item returned by glob.glob
. See below for an example of how you might do this.
import glob
def process_contents(contents):
# Process file contents here
filenameglob = glob.glob("*.txt")
if filenameglob: # If glob.glob returned list of matches
for filename in filenameglob: # For each file in filenameglob list
print(filename)
with open(filename, "r") as f: # Open current file in read mode
contents = f.read() # Read contents from current file to variable
process_contents(contents) # Send contents from file to function for processing
else: # Else if glob.glob returned empty list
print("No .doremi files found!")
# Define behaviour in case of no .doremi files found
The above code will work for any number (0...n) of files returned by glob.glob
, as such I would recommend taking this approach as to better mitigate the risk of your code processing the "wrong" .doremi
file - as may happen in the Basic Answer as it will only process the first in the list, even if multiple are present.

- 1,507
- 5
- 10