Newsgroup: it.comp.macintosh
Titolo: Carattere di fine riga.

Mi rivolgo a tutti i programmatori che sviluppano sotto
windows,linux,e Mac non so se questo comportamento può essere provato
anche su altri sistemi operativi che io non conosco. Premesso che ho
rielaborato un programma trovato qui sotto Mac nella sezione demo e il
cui nome è Controllo_docu.py che allego a questo messaggio, Sapete
benissimo che i tre S.O. che ho citato sogliono usare un carattere di
fine riga nei file di testo. Considerato che i File sorgenti in python
vengono trattati,dagli editor, alla stregua dei file di testo, anche a
loro si applica questa regola:
Unix e quindi anche linux  usano come carattere di fine riga "CR"
Mac S.O. 10.6.8 ( penso anche tutti i prec e seguen) usano "LF"
Windows xp Vista e  7 (precedenti e seguenti) usano  "CRLF"
ed ora voi conosciete la funzione string.split() che trasforma una
stringa in cui appaiono delle parole separate da virgole in una lista
le cui parole presnti nella stringa appaiono nello stesso ordine nella
lista come membri?
per esempio
a="Gennaio,Febbraio,Marzo,Aprile,Maggio,Giugno,Luglio,Agosto,Settembre,Ottobre,Novembre,Dicembre"
A = string.split(a)
Print A
['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre']
e fino a qui nulla di particolare
Ora attenzione  io ho spesso l'abitudine di costruirmi dei file di
testo dove conservare i miei dati esempio una rubrica telefonica:
la riga da memorizzare contiene
Cognome,Nome,Indirizzo,cap,citta,prov
nel mio file di testo ci saranno tante righe quanti sono i record o le
righe cognome ecc esempio
Catalano,Giovanni,Via del Monte 14,00142,Roma
Veronese,Giorgio,Via della Vittoria 321,00186, Roma
Alibrandini,Filippo,Via Garibaldi 167,00156,Roma
ora se questo documento lo sto preparando con un editor sotto
Unix ogni riga sarà terminata con "CR"
MAC ogni riga sarà terminata con "LF"
Windows   ogni riga sarà terminata con "CRLF"
Ora supponiamo che con un programmino python voglia leggere le
informazioni da mettere a video intestando le colonne con:
Cognome, Nome,Indirizzo,Cap,Citta,Provincia
posso usare  la funzione per leggere una riga per volta
e cioè :
f= open("rubrica.txt","r")
riga = f.readline()
cosi facendo leggerei anche il carattere di fine riga che non mi serve
e per depurare la riga letta dal carattere inutile che tra le altre
cose non è nemmeno stampabile
dovre scrivere per Unix e Mac
riga = freadline(); riga = riga[0:-1]
mentre per Windows  riga = riga[0:-2]
poichè a priori non posso sapere quale stile troveremo
(Unix,Mac,Windows) allora dopo aver letto la riga  riga =f.readline()
andrò a verificare
if riga[-2:-1] = "CR" :
   siamo in presenza di windows
   la  riga da leggere sarà riga = riga[0:-2]
else:  sia in presenza di Unix o Mac
   riga= riga[0:-1]
 Tuttociò vi sembrerà banale ma io ho impiegato 1giorno e 1/2 per
capire questo errore  e cioe mentre sotto windows la procedura mi
girava perfettamente sotto Mac mi andava in errore in quanto la riga
conteneva un carattere che io non gestivo perche non sapevo di averlo
Tenete presente che il file di testo era stato realizzato sempre da me
e come fine righe usavo lo stile windows che richiedeva "CRLF"  Quindi
lavorando sotto Mac avevo sempre un carattere in più.
Come promesso metto qua il sorgente dell'Applicativo che  controlla il
carattere di fine riga.
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""Controlla file di testo -
    Controlla quale sia  il carattere di fine riga per determinarne lo
stile
    Se la riga termina   con CR   abbiamo lo stile UNIX
    Se  "   "        "          "   LF    abbiamo lo stile MAC
    Se  "   "        "          "   CRLF abbiamo lo stile Win/MS-Dos
    Mettiamo una alternativa all'inserimento del file aggiungiamo
    una parte di codice che nel caso non indichiamo un nome
    di file o ne indicassimo uno mancante o assente vada a cercare il
file
    dal quale siamo partiti cioe' questo stesso che dovrebbe essere
contenuto
    nella variabile argv che come e' noto e' una lista di parametri
passati dalla
    linea di comando e il primo elemento della lista e' proprio il
nome i questo
    applicativo che seppure non e' il classico file di testo anch'esso
ha i caratteri
    di fine riga esattamente come quelli dei classici file di testo e
quindi possiamo
    esaminarli per decidere quale stile seguono.
  """
 
import sys,os
 
import string
def Message(parametro):
	#print "\nquesta e' la funzione che stampera' Il parametro ricevuto"
	print "\n:",parametro
 
def ChiediFiledaAprire(message):
	print "\n"+message
	nome = raw_input( "\ninserisci il nome di un file di testo completo
di estensione \n: ")
	return nome
 
#pathname = sys.path
#print "pathname=",pathname
def main():
	#print os.listdir(sys.path[0])
	while True:
		name = ChiediFiledaAprire(message='Per controllo del carattere di
fine linea presente nel file')
		if name == "":
			print "Poiche' non hai digitato alcun nome il controllo lo
effettuera'\
			sul file "+ sys.argv[0] +" che e' in esecuzione "
			name = sys.argv[0];break
		elif not name:
			print "Attenzione !! Il nome file digitato  non esiste, effettuero'
\
			il controllo sul file "+sys.argv[0] +" che e' in  esecuzione "
			name = sys.argv[0];break
		else:
			break
	fp = open(name, 'rb')
 
	try:
		data = fp.read()
		#print "nel file",name," abbiamo trovato",data
	except MemoryError:
		Message("Attenzione, Il file e' troppo grande.")
		sys.exit(0)
	if len(data) == 0:
		Message("Il File e' vuoto.")
		sys.exit(0)
	number_cr = string.count(data, '\r')
	number_lf = string.count(data, '\n')
	if number_cr == number_lf == 0:
		Message('Nel File '+name+' manca il carattere di fine riga.')
	if number_cr != 0 and chr(10) not in data:
		Message('Il File '+name+' presenta lo style unix con fine riga =
CR')
	elif number_lf != 0 and   chr(13) not in data:
		Message('Il File '+name+' presenta lo style mac con fine riga = LF')
	elif number_cr == number_lf:
		Message('Il File '+name+' presenta lo style Win/MS-Dos con fine riga
=CRLF')
	else:
		Message('Il File '+name+' presenta un fine riga non riconosciuto
(binary file?)')
 
 
if __name__ ==  '__main__':
      main()

    riga= riga[0:-1]
 
Se devi semplicemente eliminare i caratteri inutili (spazi, cr, lf, ...)
a fine riga basta usare rstrip:
 
In [69]: 'abc  \n'.rstrip()
Out[69]: 'abc'
 
In [70]: 'abc  \r\n'.rstrip()
Out[70]: 'abc'
 
Per eliminare solo cr e lf lasciando eventuali spazi:
 
In [71]: 'abc  \r'.rstrip('\r\n')
Out[71]: 'abc  '
 
 
Mauro