[Tutor] (no subject)
Marc Tompkins
marc.tompkins at gmail.com
Sun Jul 20 22:37:57 CEST 2014
On Sun, Jul 20, 2014 at 8:40 AM, LN A-go-go
<lnartist at yahoo.com.dmarc.invalid> wrote:
>
> States OJ
> AK 36
> AL 39
> AR 39
> AZ 45
> CA 61
> CO 54
> CT 61
> DC 93
> DE 62
> FL 51
> GA 47
> HI 72
> IA 54
> ID 36
> IL 62
> IN 50
> KS 41
> KY 41
> LA 40
> MA 62
> MD 62
> ME 58
> MI 57
> MN 54
> MO 49
> MS 43
> MT 47
> NC 50
> ND 45
> NE 41
> NH 54
> NJ 57
> NM 57
> NV 55
> NY 62
> OH 51
> OK 34
> OR 57
> PA 55
> RI 63
> SC 45
> SD 45
> TN 42
> TX 44
> UT 34
> VA 53
> VT 67
> WA 58
> WI 56
> WV 43
> WY 33
>
> >>> myfile.close()
> >>> infile = open('C:/Python27/egund919/Program1/BOJ_B.txt','r')
> >>> import string
> >>> state_name = []
> >>> data_value = []
> >>> counter = 0
> >>> x = 0
> >>> line = infile.readline()
> >>> while True:
> line = infile.readline()
> if not line: break
> counter = counter + 1
> States, OJ = string.split(line)
> XSTATES = str(States)
> XNUM = int(OJ)
> state_name.append(XSTATES)
> data_value.append(XNUM)
>
> >>> len(counter)
> Traceback (most recent call last):
> File "<pyshell#29>", line 1, in <module>
> len(counter)
> TypeError: object of type 'int' has no len()
> >>> counter.count
> Traceback (most recent call last):
> File "<pyshell#30>", line 1, in <module>
> counter.count
> AttributeError: 'int' object has no attribute 'count'
> >>> len(state_name)
> 0
> >>> list.state_name
> Traceback (most recent call last):
> File "<pyshell#32>", line 1, in <module>
> list.state_name
> AttributeError: type object 'list' has no attribute 'state_name'
>
First of all, I would take advantage of the "with" construction, like so:
with open('C:/Python27/egund919/Program1/BOJ_B.txt','r') as infile:
#do stuff with infile
When the block of code inside of the "with" section finishes, Python
will take care of closing the file for you - even if your program
encountered an error. MAJOR advantage over doing it yourself.
Second, there's no need to import "string" anymore; all of the
functions defined in that module are native methods of strings.
"line" is a string, so you can just do "line.split()". split()
returns a list; you can get the first item in that list with
line.split()[0], the second item with line.split()[1], etc.
Third, free your mind from the shackles of counting how many objects
are in a list and using that counter as the index of your loops - this
is not the Python way! Instead, let Python take care of the counting
and indexing for you.
Fourth (and here I differ from some of the others on this list,
notably Alan G) - I don't like the "while True: / break" paradigm.
Your mileage may vary, but I find it makes it harder to understand
what the program is actually trying to achieve. In your case, you
read a line from the file, then check whether it contains anything; I
like to move the readline() to the bottom of the loop.
Having said all that, here's my suggested version:
state_name = []
data_value = []
with open('C:/Python27/egund919/Program1/BOJ_B.txt','r') as infile:
line = infile.readline() # Doing this twice because you
apparently want to discard the first line...?
line = infile.readline()
while line:
state_name.append(line.split()[0])
data_value.append(line.split()[1])
line = infile.readline()
print(state_name)
print(data_value)
More information about the Tutor
mailing list