Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: program in Python; Hoe kan ik de tekst in een bestand pipen naar mijn programma?  (gelezen 1387 keer)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Ik wil de inhoud van een bestand via een pipe naar mijn eigen gemaakte programma sturen. Het programma staat is niet geinstalleerd, maar gewoon in de map oefeningen in mijn home map.
Hoe doe ik dat?

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Het probleem zit niet in de pipe. Het tekstbestand staan regels die hij moet overslaan. Tweede probleem is dat het bestand uit meerdere regels bestaat. Daardoor komt alleen de eerste regel binnen.
cat file.pgn | python chess.py
i.p.v. de inhoud van  het bestand met de chess game moet de bestandsnaam gepiped worden en uitgelezen worden.
Hier kom ik het probleem tegen dat er nutteloze informatie in het bestand staan. Dat zijn alle regels die met een '['beginnen of lege regels. Verder moet het programma het teken herkennen voor een nieuwe regel. Hoe gebruik ik dat teken in een if statement?

Offline FreeTheBee

  • Lid
  • Steunpunt: Nee
Om een bestand in te lezen zou ik open() gebruiken in het script ipv een pipe. Je zou dan gewoon de bestandsnaam als argument kunnen geven, bijv.
import sys

fname = sys.argv[1]
fin = open(fname)

Je start het script vervolgens met iets als,
./foo.py filename.pgn

Regels lezen kan met fin.readline(), fin.readlines(), of   for line in file: ...
Eenvoudig filteren op lege regels en regels die beginnen met '[' kan als volgt,
for line in fin:
    line =  line.rstrip()
    if line.startswith('['):
        ...
Een lege regel bevat nog een regelafbreek teken ('\n') met rstrip haal je die eruit, zodat je een lege string overhoudt. Een if die op line werkt is dan voor lege regels dus False.

Voor je laatste vraag, over nieuwe regels, heb ik te weinig info om te kunnen helpen.
« Laatst bewerkt op: 2013/10/29, 18:46:16 door FreeTheBee »

Offline MKe

  • Lid
  • Steunpunt: Nee
Argumentparser is eigelijk nog netter. Ook moet je dan geen 'open' gebruiken, maar hoor je tegenwoordig de functie 'file' te gebruiken.

Maar als rechtstreekse antwoord op de vraag:
import sys
for line in sys.stdin: # sys.stdin is een fileobject die de 'gepipete' data bevat.
    if line.strip() and not line.startswith('['): # alleen doen als de regel niet leeg is en niet begint met een [
        print line # print de uitgelezen regel als voorbeeld
Een fileobject is dus een iterator, waar je met een loop de regels 1 voor 1 uitleest. Je kunt maar 1 kant op, dus van begin naar eind.
« Laatst bewerkt op: 2013/10/29, 19:18:35 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Het eerste deel van het programma is klaar. Ik ben alleen nog een database met openingen nodig om de zetten van de invoer met de database te vergelijken.

Bedankt voor de hulp.

Offline FreeTheBee

  • Lid
  • Steunpunt: Nee
Het kan altijd mooier, ik probeerde het zo eenvoudig mogelijk te houden. Wat zijn de voordelen van file()? In python3 is deze niet meer aanwezig.

Offline Nunslaughter

  • Lid
    • timovwb
  • Steunpunt: Nee
Ook moet je dan geen 'open' gebruiken, maar hoor je tegenwoordig de functie 'file' te gebruiken.

Dit klopt niet echt. Documentatie zegt:

When opening a file, it’s preferable to use open() instead of invoking this constructor directly. file is more suited to type testing (for example, writing isinstance(f, file)).

En file() is zelfs verwijderd uit Python 3:
Removed file. Use open().

De beste manier is tegenwoordig om open() als een contextmanager te gebruiken (sinds Python 2.5?).

with open("bestand.txt") as infile:
    for line in infile:
        # Process!

Dit heeft als grote voordeel dat close() automatisch word aangeroepen zowel bij het normaal beëindigen van de with-block en ook bij een onverwachte fout.

Offline MKe

  • Lid
  • Steunpunt: Nee
Ah, dat wist ik niet. Bij de python cursus die ik ooit heb gehad werd dit anders verteld en ik gebruik file in al mijn scripts. Zal mijn leven beteren, bedankt.