2011-06-23 4 views
5

Mam funkcja, która przetwarza zawartość pliku, ale teraz mam nazwa pliku ustalony w zależności jak to jako argumentu słowa kluczowego:Python 3.x funkcja połączenia z sys.argv []

def myFirstFunc(filename = open('myNotes.txt', 'r')): 
    pass 
#and I call it like this: 

myFirstFunc() 

I chciałby traktować argument jako nazwę pliku i przetwarzać zawartość.

  1. Jak zmodyfikować oświadczenie wyżej Próbowałem to: filename= sys.argv[1]# or is it 0?
  2. jak mam nazwać?

Proszę o pomoc z podstawowym Pythonie (ucze sie)

Dzięki

+3

Nie używać domyślnych parametrów takich jak to. Otworzy się plik "myNotes.txt", nawet jeśli funkcja nigdy nie zostanie wywołana. Domyślne parametry powinny prawie zawsze być wartościami niezmiennymi. –

+3

"Mam nazwę pliku na stałe w funkcji ..." Nie, nie robisz; masz określony obiekt pliku jako parametr domyślny. To naprawdę zły pomysł. Chcesz przekazać rzeczywistą nazwę 'myNotes.txt'' do funkcji, a nie wynik' open() '. Niech ciało funkcji wykona operację 'open()'. –

Odpowiedz

7

coś takiego:

#!/usr/bin/python3 

import sys 


def myFirstFunction(): 
    return open(sys.argv[1], 'r') 

openFile = myFirstFunction() 

for line in openFile: 
    print (line.strip()) #remove '\n'? if not remove .strip() 
    #do other stuff 

openFile.close() #don't forget to close open file 

następnie nazwałbym go tak:

./readFile.py temp.txt

, który wyświetli treść pliku temp.txt

sys.argv[0] wyświetli nazwę skryptu. W tym przypadku ./readFile.py

Aktualizacja Moja odpowiedź
ponieważ wydaje się, inni chcą podejścia try

How do I check whether a file exists using Python? jest dobre pytanie na ten temat, w jaki sposób sprawdzić, czy plik istnieje. Nie wydaje się być niezgoda na której metody użyć, ale przy użyciu wersji przyjętej byłoby jak następuje:

#!/usr/bin/python3 

import sys 


def myFirstFunction(): 
    try: 
     inputFile = open(sys.argv[1], 'r') 
     return inputFile 
    except Exception as e: 
     print('Oh No! => %s' %e) 
     sys.exit(2) #Unix programs generally use 2 for 
        #command line syntax errors 
        # and 1 for all other kind of errors. 


openFile = myFirstFunction() 

for line in openFile: 
    print (line.strip()) 
    #do other stuff 
openFile.close() 

które wyjście następuje:

$ ./readFile.py badFile 
Oh No! => [Errno 2] No such file or directory: 'badFile' 

prawdopodobnie można zrobić to z if oświadczenie, ale podoba mi się this komentarz na temat EAFP VS LBYL

+1

Notatka do dodania - Należy zachować ostrożność podczas pobierania danych wejściowych z wiersza poleceń. Co jeśli argument nie jest prawidłową ścieżką do pliku? A co, jeśli nie ma argumentów?Nie ma znaczenia natychmiast dla tego szybkiego przykładu, ale dobrze jest pamiętać o testowaniu i przyszłej pracy. –

+0

Muszę się zgodzić z Dougiem. Zrobiłbym to nieco inaczej w produkcji, ale to może wystarczyć na pytanie. Coś więcej może odwrócić uwagę od bezpośredniego pytania. Ale jeśli jest to prosta manipulacja tekstem dla osobistych potrzeb, to powinno być wszystko, czego potrzebujesz. – matchew

+0

Uzgodniono również. Chodziło raczej o to, żeby później to zaznaczyć. Nie wyglądało to na kolejną odpowiedź tylko dlatego, że ten dodatek był potrzebny :) –

2

Dla Pythona 3 można użyć menedżera kontekstu.

# argv[0] is always the name of the program itself. 
try: 
    filename = sys.argv[1] 
except IndexError: 
    print "You must supply a file name." 
    sys.exit(2) 

def do_something_with_file(filename):  
    with open(filename, "r") as fileobject: 
     for line in fileobject: 
      do_something_with(line) 

do_something_with_file(filename) 
2

To więcej niż prosiłaś, ale tutaj jest wspólne idiom używam za korzystanie argumenty wiersza poleceń:

def do_something_with_file(filename):  
    with open(filename, "r") as fileobject: 
     for line in fileobject: 
      pass # Replace with something useful with line. 

def main(args): 
    'Execute command line options.' 
    try: 
     src_name = args[0] 
    except IndexError: 
     raise SystemExit('A filename is required.') 

    do_something_with_file(src_name) 


# The following three lines of boilerplate are identical in all my command-line scripts. 
if __name__ == '__main__': 
    import sys 
    main(sys.argv[1:]) # Execute 'main' with all the command line arguments (excluding sys.argv[0], the program name). 
+0

Twoje rozpakowanie krotki nie jest równoznaczne z kodem w twoim komentarzu, ponieważ spowoduje zgłoszenie więcej niż jednego argumentu (jest to dobry efekt uboczny , ale spowoduje to, że podany komunikat o błędzie będzie nieco niepoprawny). –

+0

@Steve Howard, dobry punkt. Zostawię ten kod, dopóki nie będzie więcej parsowania wiersza poleceń. –