Hur man hanterar filer i Python

By rik

Filhantering i Python: En detaljerad genomgång

I programmeringsvärlden är förmågan att hantera filer en grundläggande färdighet. Python erbjuder omfattande stöd för att interagera med filer på olika sätt, inklusive att läsa, skriva och modifiera dem.

Efter att ha tagit del av den här guiden kommer du att kunna:

  • Öppna och extrahera information från filer i Python.
  • Läsa enstaka rader från textfiler.
  • Skapa och lägga till data i filer.
  • Använda kontexthanterare för effektiv filhantering.

Att läsa filer i Python

För att öppna en fil i Python används funktionen open() med följande struktur: open('filnamn', 'läge').

  • filnamn refererar till det exakta namnet på filen.

Observera: Om filen befinner sig i samma mapp som ditt skript räcker det med filnamnet. Annars måste du ange den fullständiga sökvägen till filen.

  • läge bestämmer filens öppningsläge.

Standardläget för att öppna en fil är läsläge, betecknat med ’r’. Det är dock en god praxis att explicit ange läget.

Innan vi börjar, låt oss bekanta oss med filen `lib.txt`, som vi använder som exempel.

📁 Du kan ladda ner textfilen och koden från detta GitHub-repo.

Följande kodavsnitt illustrerar hur du öppnar och läser innehållet i `lib.txt` med open() funktionen.

      
        file = open('lib.txt','r')
        contents = file.read()
        print(contents)
        file.close()

        # Utskrift:
        # Hello, there!
        # Here are a few helpful Python libraries:
        # 1) NumPy
        # 2) pandas
        # 3) matplotlib
        # 4) seaborn
        # 5) scikit-learn
        # 6) BeautifulSoup
        # 7) Scrapy
        # 8) nltk
        # 9) Bokeh
        # 10) statsmodels
      
    

I ovanstående exempel:

  • open() skapar ett filobjekt som vi refererar till som file.
  • Metoden read() används för att läsa hela filens innehåll.
  • Filens innehåll lagras i variabeln contents och skrivs ut.
  • Slutligen stängs filen med close().

Om du glömmer att stänga filen, kan det leda till resursläckage, vilket blir särskilt märkbart när du arbetar med många filer. Det är viktigt att stänga filer efter användning för att frigöra minne.

Låt oss nu utforska ett säkrare och mer effektivt sätt att hantera filer med kontexthanterare. Nedan visas ett exempel.

      
        with open('lib.txt','r') as f:
          contents = f.read()
          print(contents)
      
    

Med kontexthanterare behöver du inte manuellt stänga filerna. De stängs automatiskt när programblocket avslutas.

Att läsa enskilda rader från en fil

Vårt exempel, `lib.txt`, är relativt litet, och att läsa hela filens innehåll på en gång utgör inget problem. Men för stora filer kan metoden read() bli ineffektiv och potentiellt orsaka minnesproblem. Därför kan det vara mer praktiskt att läsa enstaka rader från filen.

Att använda `readline()`

Metoden readline() läser en rad åt gången.

Studera följande kod:

      
        with open('lib.txt','r') as f:
          line = f.readline()
          print(line)
          line = f.readline()
          print(line)

        # Utskrift:
        # Hello, there!
        #
        # Here are a few helpful Python libraries:
      
    

Det första anropet till readline() hämtar och skriver ut den första raden, medan det andra anropet hämtar den andra raden. Detta beror på att filpekaren flyttas till nästa rad efter varje readline()-anrop.

Du kan använda tell() för att få filpekarens aktuella position och seek() för att flytta den till en specifik position.

I exemplet nedan använder vi f.seek(0) för att flytta filpekaren tillbaka till början efter att ha läst den första raden. Detta resulterar i att den första raden skrivs ut två gånger.

      
        with open('lib.txt','r') as f:
          line = f.readline()
          print(line)
          f.seek(0)
          line = f.readline()
          print(line)

        # Utskrift:
        # Hello, there!
        #
        # Hello, there!
      
    

Att använda `readlines()`

Metoden readlines() hämtar alla rader från filen och returnerar dem som en lista.

      
        with open('lib.txt','r') as f:
          lines = f.readlines()
          print(lines)

        # Utskrift:
        # ['Hello, there!\n', 'Here are a few helpful Python libraries:\n', '1) NumPy\n', '2) pandas\n', '3) matplotlib\n', '4) seaborn\n', '5) scikit-learn\n', '6) BeautifulSoup\n', '7) Scrapy\n', '8) nltk\n', '9) Bokeh\n', '10) statsmodels\n', '\n']
      
    

Att iterera med en for-loop

Du kan också läsa filens rader med en for-loop. Genom att iterera över filobjektet läses varje rad och kan bearbetas separat, utan att hela filen laddas in i minnet samtidigt.

      
        with open('lib.txt','r') as f:
          for line in f:
            print(line, end='')
      
    

Observera: Standardbeteendet för print() är att lägga till en ny rad. Vi justerar detta med end='' för att undvika dubbla rader.

Att läsa filens innehåll i delar

Python tillåter dig att läsa filen i bitar av önskad storlek.

I följande exempel ställer vi in chunk_size till 50, läser in de första 50 tecknen och skriver ut dem. Vi använder sedan tell() för att verifiera filpekarens aktuella position.

      
        chunk_size = 50
        with open('lib.txt','r') as f:
          chunk = f.read(chunk_size)
          print(chunk)
          current = f.tell()
          print(f"Filpekarens position: {current}")

        # Utskrift:
        # Hello, there!
        # Here are a few helpful Python librar
        # Filpekarens position: 51
      
    

Du kan använda den här tekniken för att läsa hela filen i mindre segment.

I nedanstående exempel används en while-loop för att läsa och skriva ut filens innehåll i bitar om 50 tecken tills filens slut nås.

      
        chunk_size = 50
        with open('lib.txt','r') as f:
          chunk = f.read(chunk_size)
          print(chunk,end='')

          while(len(chunk)>0):
            chunk = f.read(chunk_size)
            print(chunk,end='')

        # Utskrift:
        # Hello, there!
        # Here are a few helpful Python libraries:
        # 1) NumPy
        # 2) pandas
        # 3) matplotlib
        # 4) seaborn
        # 5) scikit-learn
        # 6) BeautifulSoup
        # 7) Scrapy
        # 8) nltk
        # 9) Bokeh
        # 10) statsmodels
      
    

Att skriva till filer

För att skriva till en fil, måste du öppna den i skrivläge (’w’).

Följande kod skapar eller överskriver innehållet i `new_file.txt` med texten ”Hello, Python!”.

      
        with open('new_file.txt','w') as f:
          f.write('Hello, Python!')
      
    

Om du kör koden flera gånger, kommer filens innehåll att skrivas över varje gång, vilket betyder att ”Hello, Python!” bara kommer att finnas en gång i filen.

Om du istället vill lägga till text till filen utan att överskriva befintligt innehåll, ska du använda tilläggsläget, vilket demonstreras i nästa avsnitt.

Att lägga till text i filer

För att lägga till data i slutet av en fil utan att skriva över befintligt innehåll, öppnar du filen i tilläggsläge (’a’).

Om du kör följande kod två gånger, kommer texten ”Hello, Python!” att läggas till filen två gånger.

      
        with open('new_file.txt','a') as f:
          f.write('Hello, Python!')
      
    
        
            # Utskrift: Hello, Python!Hello, Python!
        
    

Sammanfattning

Här följer en snabb sammanfattning av de viktigaste punkterna:

  • Du har lärt dig att använda funktioner för fil-I/O såsom läsning, skrivning och att lägga till data.
  • Du har även fått kunskap om hur man använder seek() för att flytta filpekaren och tell() för att hämta dess position.

Förhoppningsvis har du tyckt att den här handledningen var användbar. När du nu har fått grepp om hur du hanterar textfiler i Python, kan du utforska hanteringen av JSON-filer i Python.

Relaterat:

Kontrollera längden på en lista i Python i 3 steg.