Considering migrating to Python from Visual Basic 6 for engineering applications
Christian Gollwitzer
auriocus at gmx.de
Sat Feb 20 14:21:13 EST 2016
Am 20.02.16 um 19:45 schrieb wrong.address.1 at gmail.com:
> On Saturday, 20 February 2016 09:54:15 UTC+2, Steven D'Aprano wrote:
>> To answer your question "Do I need something fancy...?", no, of course not,
>> reading a line of numbers from a text file is easy.
>>
>> with open("numbers.txt", "r") as f:
>> for line in f:
>> numbers = [int(s) for s in split(line)]
>>
>
> This looks good enough. This does not seem complicated (although I still understand almost nothing of what is written). I was simply not expressing myself in a way you people would understand.
>
>>
>> will read and convert integer-valued numbers separated by whitespace like:
>>
>> 123 654 9374 1 -45 3625
>>
>>
>> one line at a time. You can then collate them for later use, or process them
>> as you go. If they're floating point numbers, change the call to int() to a
>> call to float().
>>
>
> And I guess if the first three numbers are integers and the fourth is a float, then also there must be some equally straightforward way.
If you know in advance, what you expect, then it is easy. Most people
who gave you answers assumed that you have a messy file and don't know
if an int or float follows, and you want a program which decides by
itself whether to read an int, float or string.
Whereas, if the format is fixed, for 3 ints and 1 float, you could do:
str='1 2 3 3.14159' # some example
fmt=(int,int,int,float) # define format
a,b,c,d=[type(x) for (type,x) in zip(fmt, str.split())]
It's one line, but it might look involved and actually it uses a list
comprehension, tuple unpacking and first class functions, so it's
certainly not comprehensible from the first Python lesson. Another
alternative would be sscanf. This is a 3rd party module which simulates
C sscanf, optimized more or less for this kind of number parsing:
https://hkn.eecs.berkeley.edu/~dyoo/python/scanf/
After installing that, you can do:
from scanf import sscanf
str='1 2 3 3.14159'
a,b,c,d=sscanf(str, '%d %d %d %f')
whereby '%d' means integer and '%f' is float. sscanf also handles
fixed-width columns which you often get from Fortran programs.
Christian
More information about the Python-list
mailing list