I'm having trouble getting my user input into a subprocess command. Everything seems to work fine until it takes the screenshot and it ends up choosing the last item in the list instead of the entered number. I have 4 files in the folder that fit the endswith requirement and they all print correctly. Any help with this would be much appreciated.
import os
import subprocess
user_choice = input("Enter a directory: ")
location = os.scandir(user_choice)
list1 = []
for file in location:
if file.name.endswith(('.mp4', '.mkv')):
list1.append(file.name)
for count, ele in enumerate(list1, 1):
print(str(count) + ".", ele)
f1 = input("Select a file: ")
f2 = list1[int(f1)]
subprocess.run(['ffmpeg', '-i', f2, '-ss', '00:00:02', '-vframes', '1', f'{file.name.split(".")[0]}.png'])
In the line
subprocess.run(['ffmpeg', '-i', f2, '-ss', '00:00:02', '-vframes', '1', f'{file.name.split(".")[0]}.png'])
file
will be the last
file
asigned in the loop by
location
as it has not been defined as anything since then.
In the line
f2 = list1[int(f1)]
f2
has been assigned as the chosen item from the list and then nothing is done with it.
I think I'm lacking understanding of what I'm doing with
file
early in the script.
I'm actually unsure of how
file
is created in the first place. There's no strict definition at the beginning. Googling hasn't yielded anything useful yet.
I tried to manually assign
f2
as the value for
file
with
file = str(f2)
before the subprocess command but that yields the following error:
Error:
AttributeError: 'str' object has no attribute 'name'
I didn't think it would work but I'm at a loss at the moment.
(Jul-24-2020, 07:59 PM)pythonnewbie138 Wrote: [ -> ]I think I'm lacking understanding of what I'm doing with file
early in the script.
I'm actually unsure of how file
is created in the first place. There's no strict definition at the beginning. Googling hasn't yielded anything useful yet.
for file in location:
file
is assigned the value of each item in location.
if location was a list
[0, 1, 2, 3]
as it looped through each time
file = 0 # first loop
file = 1 # second loop
file = 2 # third loop
file = 3 # forth loop
file would now by pointing to 3 after the loop
(Jul-24-2020, 07:59 PM)pythonnewbie138 Wrote: [ -> ]I tried to manually assign f2
as the value for file
with file = str(f2)
before the subprocess command but that yields the following error:
Error:
AttributeError: 'str' object has no attribute 'name'
I didn't think it would work but I'm at a loss at the moment.
In the loop you have
list1.append(file.name)
so list1 now contain strings of the file names
when the selection is made
f2 = list1[int(f1)]
f2 now contains the chosen filename string
f2.split(".")[0]
would give the filename string less its extension.
Thanks for breaking it down. So helpful!
This works now!
subprocess.run(['ffmpeg', '-i', f2, '-ss', '00:00:02', '-vframes', '1', f'{f2.split(".")[0]}.png'])
There's 1 part left that I'm unsure how to approach.
Currently the selection is based on the Index (0-3 in this situation). How can I align the enumerated list with the index?
The script prints "1", "2", etc in front of the printed filenames based on the count but the input is based on the index location.
How can I make the input options (1-4) match the index options (0-3) so an input of 1 points to index 0? I initially thought the enumeration starting at 1 would do this but apparently that's not the case.
You could reduce the input number by 1
f1 = input("Select a file: ")
f2 = list1[int(f1)-1]
(Jul-24-2020, 08:54 PM)Yoriz Wrote: [ -> ]You could reduce the input number by 1
f1 = input("Select a file: ")
f2 = list1[int(f1)-1]
Wow that was simple. I learned a lot from this thread. Thank you so much!