python {megoldva}

Sziasztok.

Életem első python-dolgait tanulom éppen és rájöttem, hogy ez bizony nem BASH.
Paraméternek mar át tudok adni stringet, és azt mar utána lehet kezelni. Most azt szeretnem, hogy fájlból olvasson és minden sort külön stringként kezeljen, külön névvel.

Eddig jutottam el:

root@logger:/usr/src/examples# cat olvasas.py
#!/bin/python
import sys,os
file='/logger'
job_id=os.path.join(file)
f=open(job_id,'r').readlines()
print f

root@logger:/usr/src/examples# cat /logger
2015febr7
root@logger:/usr/src/examples# python olvasas.py
['2015febr7\n']
root@logger:/usr/src/examples#

A problémám az, hogy amikor f-et kiírja, akkor azt így teszi:
['2015febr7\n']
és nem így:
2015febr7

Ez miért van?
Biztos valami őrületesen egyszerű dologról van szó...

Hozzászólások

Pontositva igy tudom megfogalmazni BASHban:

f="`cat /logger | awk 'BEGIN {FS=" "}{print $1}'`"
echo $f

---
--- A gond akkor van, ha látszólag minden működik. ---
---


#!/usr/bin/python

fname='logger'
for s in open(fname, 'r').readlines():
  s=s.rstrip() # sorvégi \n levágása
  print s

Hát, ha abból indulunk ki, hogy a Python olyan nyelv szeretne lenni, ami rendre nevel (hogy ez sikerült-e, azt ne firtassuk), akkor valahol logikus az, hogy megköveteli azt, hogy még a kommentnek is az legyen a kódolása, mint minden másnak. Fura, de valamennyire el tudom fogadni.

Aki rendetlen, az ne kódoljon. Mert a forráskód kinézete a fejlesztés nem túl lényeges szelete: nagyobb projekteknél a kötelező formázási konvenciókat betartató formázó tool-on megy keresztül a forráskód, mielőtt a verziókezelőbe vissza lenne pakolva.
A változók, eljárások nevezéktana esetében például sokkal fontosabb, hogy rend legyen, hogy "szép", egységes legyen, erre ugyanis nem nagyon van automatizmus még :-P

Viszont az egyszerűség, a kezdőbarátság is hol deklarált célként, hol pro tulajdonságként jelenik meg.
Mármost a fenti tükrében azt, hogy csórikám beírja a bármit azután a kommentjel után, ami a "Hogyan legyünk Python programozók 12 másodperc alatt?"-féle könyvek szerint éppen arra szolgál, hogy utána bármi beírható legyen, mire az egésznek a taknya-nyála egybefolyik... hát nem tom, én nehezen tudnám védeni egy csapatnyi középiskolás előtt.

valamiért ==> a 3.x inkompatibilis "másik python", helytelenül viszi a 2.x alá írt kódokat. Bár oda lehet már figyelni, mert a 2.6 illetve a 2.7 széria a váltást könnyítendő 99%-ban eszi a 3.x szintaktikát, így lehet már 99%-ban jó kódokat írni, tesztelve mindkettőn. Viszont nem figyelve 2.x szintaktikájú kóddal rendelkezhetünk, ami hibás eredményt adhat 3.x környezettel futtatva.

Nézzünk egy apró, ám fontos esetet: print 2.x-ben nyelvi elem, 3.x-ben függvény.

>>> print 5+2
2.x esetén oké, 3.x esetén hibába futunk a zárójelezés hiányában.

>>> print ("Osszeg:", 5+2)

python 3.4: "Osszeg: 7" --> string
python 2.7: ('Osszeg:', 7) --> tuple

--> from __future__ import print_function

Ez tetszik! Gyorsan meg is kerestem.
https://docs.python.org/2/library/__future__.html

- division
- absolute_import
- print_function
- unicode_literals

A fenti 4 importálásával ténylegesen lehet python-2.6 .. 3.4 verziókon 100%-ban egységesen lefutó kódot írni?

Mindent, de tényleg MINDENT meg lehet oldani, körüljárni, eltakarni (valószínűleg sokunk fizetésében jelent nagy részt az erre való hajlandóság és képesség).

Kérdés, hogy az egész hogyan viszonyul a fenti felvetéshez, amely során csóringerkém életében először szembesül azzal, hogy ez a python nem is az a python, ez a komment nem is úgy komment.

(Disclaimer: amúgy szó nincs róla, hogy ne kedvelném a nyelvet, de itt a "seemed like a good idea at the time" szagát érzem.)

Más nyelvek meg tudták oldani, hogy nem kell a szájába rágni, hogy vigyázzon, mert (oh, borzalom!) ékezetes, utf-1543125 vagy a jó ég tudja, milyen kódolású részek is vannak. Pláne kommentnél... Amit minden rendes előfeldolgozó nulladik körben kéne, hogy kihajítson, mindenféle beleolvasás és vakerálás nélkül.

És milyen szép lenne, ha a scripted ciklust, elágazást, meg ilyesmiket is tartalmazna, és ugyanilyen módon (sor eleji whitespace kiszórva) lenne megjelenítve... :-P

Azért a nyitott fájlt illik becsukni, ahogy illik nem feltételezni, hogy a teljes fájl egy nyeletre befér a memóriába:


#!/usr/bin/env python3
#-*- coding: utf-8 -*-
import sys

def main(fname):
    with open(fname) as lines:
        for line in lines:
            sys.stdout.write(line)

if __name__ == '__main__':
    main('/etc/fstab')