git17 - added fields to db+imp+tv: Won $ when seen flop and Won $ at Showdown. Seem to work fine, will verify properly later. REIMPORT is necessary after this update.
cleaned table design a bit more removed actionCount from print_hand - this is useless. need to update regression-test/*.expected.txt accordingly
This commit is contained in:
parent
0a9c2cb292
commit
33e085cf88
|
@ -2,17 +2,16 @@ todolist (db=database, imp=importer, tv=tableviewer)
|
||||||
|
|
||||||
before alpha
|
before alpha
|
||||||
============
|
============
|
||||||
verify PrintPlayerFlags for one player on at least 10 hands
|
|
||||||
fix default pathes up to sensible ones
|
fix default pathes up to sensible ones
|
||||||
catch index error, type error, file not found error
|
catch index error, type error, file not found error
|
||||||
update install instructions, include how to adapt default config and where to put it
|
update install instructions, include how to adapt default config and where to put it
|
||||||
split python requirements, get deep links for windows DL for everything
|
split python requirements, get deep links for windows DL for everything
|
||||||
GUI license info
|
GUI license info
|
||||||
|
|
||||||
db+imp+tv W$SD (won $ when seeing showdown - partial win counts partially here)
|
|
||||||
db+imp+tv WwSF (Won when seen flop - partial taken into account)
|
|
||||||
change action_no to be total for this street rather than just for one player. change .expected.txt files accordingly.
|
change action_no to be total for this street rather than just for one player. change .expected.txt files accordingly.
|
||||||
calculate 3B/4B percentage (depends on above, currently its useless)
|
calculate 3B/4B percentage (depends on above, currently its useless)
|
||||||
|
update regression testing to take into account everything new
|
||||||
|
add fpdb version string into db to detect outdated db format.
|
||||||
|
|
||||||
before beta
|
before beta
|
||||||
===========
|
===========
|
||||||
|
|
|
@ -269,52 +269,25 @@ gametypes</B></P>
|
||||||
</TD>
|
</TD>
|
||||||
</TR>
|
</TR>
|
||||||
<TR VALIGN=TOP>
|
<TR VALIGN=TOP>
|
||||||
<TD>
|
<TD><P>small_blind</P></TD>
|
||||||
<P>small_blind</P>
|
<TD><P>int</P></TD>
|
||||||
</TD>
|
<TD><P><BR></P></TD>
|
||||||
<TD>
|
</TR>
|
||||||
<P>int</P>
|
<TR VALIGN=TOP>
|
||||||
</TD>
|
<TD><P>big_blind</P></TD>
|
||||||
<TD>
|
<TD><P>int</P></TD>
|
||||||
<P><BR>
|
<TD><P><BR></P>
|
||||||
</P>
|
|
||||||
</TD>
|
</TD>
|
||||||
</TR>
|
</TR>
|
||||||
<TR VALIGN=TOP>
|
<TR VALIGN=TOP>
|
||||||
<TD>
|
<TD><P>small_bet</P></TD>
|
||||||
<P>big_blind</P>
|
<TD><P>int</P></TD>
|
||||||
</TD>
|
<TD><P><BR></P></TD>
|
||||||
<TD>
|
|
||||||
<P>int</P>
|
|
||||||
</TD>
|
|
||||||
<TD>
|
|
||||||
<P><BR>
|
|
||||||
</P>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
</TR>
|
||||||
<TR VALIGN=TOP>
|
<TR VALIGN=TOP>
|
||||||
<TD>
|
<TD><P>big_bet</P></TD>
|
||||||
<P>small_bet</P>
|
<TD><P>int</P></TD>
|
||||||
</TD>
|
<TD><P><BR></P></TD>
|
||||||
<TD>
|
|
||||||
<P>int</P>
|
|
||||||
</TD>
|
|
||||||
<TD>
|
|
||||||
<P><BR>
|
|
||||||
</P>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
|
||||||
<TR VALIGN=TOP>
|
|
||||||
<TD>
|
|
||||||
<P>big_bet</P>
|
|
||||||
</TD>
|
|
||||||
<TD>
|
|
||||||
<P>int</P>
|
|
||||||
</TD>
|
|
||||||
<TD>
|
|
||||||
<P><BR>
|
|
||||||
</P>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
</TR>
|
||||||
</TABLE>
|
</TABLE>
|
||||||
<p><BR>
|
<p><BR>
|
||||||
|
@ -746,7 +719,7 @@ far less relevant.</P>
|
||||||
<TR VALIGN=TOP>
|
<TR VALIGN=TOP>
|
||||||
<TD><P>id</P></TD>
|
<TD><P>id</P></TD>
|
||||||
<TD><P>bigint</P></TD>
|
<TD><P>bigint</P></TD>
|
||||||
<TD><P></P></TD>
|
<TD><P><br></P></TD>
|
||||||
</TR>
|
</TR>
|
||||||
<TR VALIGN=TOP>
|
<TR VALIGN=TOP>
|
||||||
<TD><P>gametypeId</P></TD>
|
<TD><P>gametypeId</P></TD>
|
||||||
|
@ -853,6 +826,17 @@ far less relevant.</P>
|
||||||
<TD><P>int</P></TD>
|
<TD><P>int</P></TD>
|
||||||
<TD><P>number of hands where someone else raised River and the player folded</P></TD>
|
<TD><P>number of hands where someone else raised River and the player folded</P></TD>
|
||||||
</TR>
|
</TR>
|
||||||
|
<TR VALIGN=TOP>
|
||||||
|
<TD><P>wonWhenSeenFlop</P></TD>
|
||||||
|
<TD><P>float</P></TD>
|
||||||
|
<TD><P>How many hands the player won after seeing the flop - this can be a "partial win" if the pot is split.<br>
|
||||||
|
To be completely clear, this stores a hand count, NOT a money amount.</P></TD>
|
||||||
|
</TR>
|
||||||
|
<TR VALIGN=TOP>
|
||||||
|
<TD><P>wonAtSD</P></TD>
|
||||||
|
<TD><P>float</P></TD>
|
||||||
|
<TD><P>As wonPostFlop, but for showdown.</P></TD>
|
||||||
|
</TR>
|
||||||
</TABLE>
|
</TABLE>
|
||||||
<P></P>
|
<P></P>
|
||||||
<P><B>Table hands_actions</B></P>
|
<P><B>Table hands_actions</B></P>
|
||||||
|
|
|
@ -343,9 +343,9 @@ blabla""")
|
||||||
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
||||||
self.window.connect("delete_event", self.delete_event)
|
self.window.connect("delete_event", self.delete_event)
|
||||||
self.window.connect("destroy", self.destroy)
|
self.window.connect("destroy", self.destroy)
|
||||||
self.window.set_title("Free Poker DB - version: pre-alpha, git16")
|
self.window.set_title("Free Poker DB - version: pre-alpha, git17")
|
||||||
self.window.set_border_width(1)
|
self.window.set_border_width(1)
|
||||||
self.window.set_size_request(750,400)
|
self.window.set_size_request(800,400)
|
||||||
self.window.set_resizable(True)
|
self.window.set_resizable(True)
|
||||||
|
|
||||||
self.menu_items = (
|
self.menu_items = (
|
||||||
|
|
|
@ -261,7 +261,9 @@ class fpdb_db:
|
||||||
otherRaisedTurn INT,
|
otherRaisedTurn INT,
|
||||||
otherRaisedTurnFold INT,
|
otherRaisedTurnFold INT,
|
||||||
otherRaisedRiver INT,
|
otherRaisedRiver INT,
|
||||||
otherRaisedRiverFold INT)""")
|
otherRaisedRiverFold INT,
|
||||||
|
wonWhenSeenFlop FLOAT,
|
||||||
|
wonAtSD FLOAT)""")
|
||||||
|
|
||||||
self.cursor.execute("INSERT INTO sites VALUES (DEFAULT, \"Full Tilt Poker\", 'USD');")
|
self.cursor.execute("INSERT INTO sites VALUES (DEFAULT, \"Full Tilt Poker\", 'USD');")
|
||||||
self.cursor.execute("INSERT INTO sites VALUES (DEFAULT, \"PokerStars\", 'USD');")
|
self.cursor.execute("INSERT INTO sites VALUES (DEFAULT, \"PokerStars\", 'USD');")
|
||||||
|
|
|
@ -113,7 +113,10 @@ def mainParser(db, cursor, site, category, hand):
|
||||||
limit_type=cursor.fetchone()[0] #todo: remove this unnecessary database access
|
limit_type=cursor.fetchone()[0] #todo: remove this unnecessary database access
|
||||||
fpdb_simple.convert3B4B(site, category, limit_type, actionTypes, actionAmounts)
|
fpdb_simple.convert3B4B(site, category, limit_type, actionTypes, actionAmounts)
|
||||||
|
|
||||||
hudImportData=fpdb_simple.calculateHudImport(playerIDs, category, actionTypes)
|
totalWinnings=0
|
||||||
|
for i in range(len(winnings)):
|
||||||
|
totalWinnings+=winnings[i]
|
||||||
|
hudImportData=fpdb_simple.calculateHudImport(playerIDs, category, actionTypes, winnings, totalWinnings)
|
||||||
|
|
||||||
if isTourney:
|
if isTourney:
|
||||||
payin_amounts=fpdb_simple.calcPayin(len(names), buyin, fee)
|
payin_amounts=fpdb_simple.calcPayin(len(names), buyin, fee)
|
||||||
|
|
|
@ -1206,7 +1206,7 @@ def store_hands_players_stud_tourney(cursor, hands_id, player_ids, start_cashes,
|
||||||
return result
|
return result
|
||||||
#end def store_hands_players_stud_tourney
|
#end def store_hands_players_stud_tourney
|
||||||
|
|
||||||
def calculateHudImport(player_ids, category, action_types):
|
def calculateHudImport(player_ids, category, action_types, winnings, totalWinnings):
|
||||||
"""calculates data for the HUD during import. IMPORTANT: if you change this method make sure to also change the following storage method and table_viewer.prepare_data if necessary"""
|
"""calculates data for the HUD during import. IMPORTANT: if you change this method make sure to also change the following storage method and table_viewer.prepare_data if necessary"""
|
||||||
#setup subarrays of the result dictionary.
|
#setup subarrays of the result dictionary.
|
||||||
VPIP=[]
|
VPIP=[]
|
||||||
|
@ -1226,6 +1226,9 @@ def calculateHudImport(player_ids, category, action_types):
|
||||||
otherRaisedTurnFold=[]
|
otherRaisedTurnFold=[]
|
||||||
otherRaisedRiver=[]
|
otherRaisedRiver=[]
|
||||||
otherRaisedRiverFold=[]
|
otherRaisedRiverFold=[]
|
||||||
|
wonWhenSeenFlop=[]
|
||||||
|
wonAtSD=[]
|
||||||
|
|
||||||
for player in range (len(player_ids)):
|
for player in range (len(player_ids)):
|
||||||
#set default values
|
#set default values
|
||||||
myVPIP=False
|
myVPIP=False
|
||||||
|
@ -1245,6 +1248,8 @@ def calculateHudImport(player_ids, category, action_types):
|
||||||
myOtherRaisedTurnFold=False
|
myOtherRaisedTurnFold=False
|
||||||
myOtherRaisedRiver=False
|
myOtherRaisedRiver=False
|
||||||
myOtherRaisedRiverFold=False
|
myOtherRaisedRiverFold=False
|
||||||
|
myWonWhenSeenFlop=0.0
|
||||||
|
myWonAtSD=0.0
|
||||||
|
|
||||||
#calculate preflop values
|
#calculate preflop values
|
||||||
street=0
|
street=0
|
||||||
|
@ -1326,6 +1331,13 @@ def calculateHudImport(player_ids, category, action_types):
|
||||||
if action_types[street][player][countOtherFold]=="fold":
|
if action_types[street][player][countOtherFold]=="fold":
|
||||||
myOtherRaisedRiverFold=True
|
myOtherRaisedRiverFold=True
|
||||||
|
|
||||||
|
if winnings[player]!=0:
|
||||||
|
if mySawFlop:
|
||||||
|
myWonWhenSeenFlop=winnings[player]/float(totalWinnings)
|
||||||
|
#print "myWonWhenSeenFlop:",myWonWhenSeenFlop
|
||||||
|
if mySawShowdown:
|
||||||
|
myWonAtSD=myWonWhenSeenFlop
|
||||||
|
|
||||||
#add each value to the appropriate array
|
#add each value to the appropriate array
|
||||||
VPIP.append(myVPIP)
|
VPIP.append(myVPIP)
|
||||||
PFR.append(myPFR)
|
PFR.append(myPFR)
|
||||||
|
@ -1344,6 +1356,8 @@ def calculateHudImport(player_ids, category, action_types):
|
||||||
otherRaisedTurnFold.append(myOtherRaisedTurnFold)
|
otherRaisedTurnFold.append(myOtherRaisedTurnFold)
|
||||||
otherRaisedRiver.append(myOtherRaisedRiver)
|
otherRaisedRiver.append(myOtherRaisedRiver)
|
||||||
otherRaisedRiverFold.append(myOtherRaisedRiverFold)
|
otherRaisedRiverFold.append(myOtherRaisedRiverFold)
|
||||||
|
wonWhenSeenFlop.append(myWonWhenSeenFlop)
|
||||||
|
wonAtSD.append(myWonAtSD)
|
||||||
|
|
||||||
#add each array to the to-be-returned dictionary
|
#add each array to the to-be-returned dictionary
|
||||||
result={'VPIP':VPIP}
|
result={'VPIP':VPIP}
|
||||||
|
@ -1363,6 +1377,8 @@ def calculateHudImport(player_ids, category, action_types):
|
||||||
result['raisedRiver']=raisedRiver
|
result['raisedRiver']=raisedRiver
|
||||||
result['otherRaisedRiver']=otherRaisedRiver
|
result['otherRaisedRiver']=otherRaisedRiver
|
||||||
result['otherRaisedRiverFold']=otherRaisedRiverFold
|
result['otherRaisedRiverFold']=otherRaisedRiverFold
|
||||||
|
result['wonWhenSeenFlop']=wonWhenSeenFlop
|
||||||
|
result['wonAtSD']=wonAtSD
|
||||||
return result
|
return result
|
||||||
#end def calculateHudImport
|
#end def calculateHudImport
|
||||||
|
|
||||||
|
@ -1413,17 +1429,19 @@ def storeHudData(cursor, category, gametypeId, playerIds, hudImportData):
|
||||||
if hudImportData['otherRaisedTurnFold'][player]: row[19]+=1
|
if hudImportData['otherRaisedTurnFold'][player]: row[19]+=1
|
||||||
if hudImportData['otherRaisedRiver'][player]: row[20]+=1
|
if hudImportData['otherRaisedRiver'][player]: row[20]+=1
|
||||||
if hudImportData['otherRaisedRiverFold'][player]: row[21]+=1
|
if hudImportData['otherRaisedRiverFold'][player]: row[21]+=1
|
||||||
|
if hudImportData['wonWhenSeenFlop'][player]!=0.0: row[22]+=hudImportData['wonWhenSeenFlop'][player]
|
||||||
|
if hudImportData['wonAtSD'][player]!=0.0: row[23]+=hudImportData['wonAtSD'][player]
|
||||||
|
|
||||||
if doInsert:
|
if doInsert:
|
||||||
#print "playerid before insert:",row[2]
|
#print "playerid before insert:",row[2]
|
||||||
cursor.execute("""INSERT INTO HudDataHoldemOmaha
|
cursor.execute("""INSERT INTO HudDataHoldemOmaha
|
||||||
(gametypeId, playerId, activeSeats, HDs, VPIP, PFR, PF3B4BChance, PF3B4B, sawFlop, sawTurn, sawRiver, sawShowdown, raisedFlop, raisedTurn, raisedRiver, otherRaisedFlop, otherRaisedFlopFold, otherRaisedTurn, otherRaisedTurnFold, otherRaisedRiver, otherRaisedRiverFold)
|
(gametypeId, playerId, activeSeats, HDs, VPIP, PFR, PF3B4BChance, PF3B4B, sawFlop, sawTurn, sawRiver, sawShowdown, raisedFlop, raisedTurn, raisedRiver, otherRaisedFlop, otherRaisedFlopFold, otherRaisedTurn, otherRaisedTurnFold, otherRaisedRiver, otherRaisedRiverFold, wonWhenSeenFlop, wonAtSD)
|
||||||
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", (row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20], row[21]))
|
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", (row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20], row[21], row[22], row[23]))
|
||||||
else:
|
else:
|
||||||
#print "storing updated hud data line"
|
#print "storing updated hud data line"
|
||||||
cursor.execute("""UPDATE HudDataHoldemOmaha
|
cursor.execute("""UPDATE HudDataHoldemOmaha
|
||||||
SET HDs=%s, VPIP=%s, PFR=%s, PF3B4BChance=%s, PF3B4B=%s, sawFlop=%s, sawTurn=%s, sawRiver=%s, sawShowdown=%s, raisedFlop=%s, raisedTurn=%s, raisedRiver=%s, otherRaisedFlop=%s, otherRaisedFlopFold=%s, otherRaisedTurn=%s, otherRaisedTurnFold=%s, otherRaisedRiver=%s, otherRaisedRiverFold=%s
|
SET HDs=%s, VPIP=%s, PFR=%s, PF3B4BChance=%s, PF3B4B=%s, sawFlop=%s, sawTurn=%s, sawRiver=%s, sawShowdown=%s, raisedFlop=%s, raisedTurn=%s, raisedRiver=%s, otherRaisedFlop=%s, otherRaisedFlopFold=%s, otherRaisedTurn=%s, otherRaisedTurnFold=%s, otherRaisedRiver=%s, otherRaisedRiverFold=%s, wonWhenSeenFlop=%s, wonAtSD=%s
|
||||||
WHERE gametypeId=%s AND playerId=%s AND activeSeats=%s""", (row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20], row[21], row[1], row[2], row[3]))
|
WHERE gametypeId=%s AND playerId=%s AND activeSeats=%s""", (row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20], row[21], row[22], row[23], row[1], row[2], row[3]))
|
||||||
else:
|
else:
|
||||||
raise FpdbError("todo")
|
raise FpdbError("todo")
|
||||||
#end def storeHudData
|
#end def storeHudData
|
||||||
|
|
|
@ -59,7 +59,7 @@ class table_viewer (threading.Thread):
|
||||||
arr=[]
|
arr=[]
|
||||||
#first prepare the header row
|
#first prepare the header row
|
||||||
if (self.category=="holdem" or self.category=="omahahi" or self.category=="omahahilo"):
|
if (self.category=="holdem" or self.category=="omahahi" or self.category=="omahahilo"):
|
||||||
tmp=("Name", "Hands", "VPIP", "PFR", "PF3B4B", "AF", "FF", "AT", "FT", "AR", "FR", "SD/F")
|
tmp=("Name", "Hands", "VPIP", "PFR", "PF3B4B", "AF", "FF", "AT", "FT", "AR", "FR", "SD/F", "W$wSF", "W$@SD")
|
||||||
else:
|
else:
|
||||||
raise fpdb_simple.FpdbError("reimplement stud")
|
raise fpdb_simple.FpdbError("reimplement stud")
|
||||||
tmp=("Name", "Hands", "VPI3", "A3", "3B4B_3" "A4", "F4", "A5", "F5", "A6", "F6", "A7", "F7", "SD/4")
|
tmp=("Name", "Hands", "VPI3", "A3", "3B4B_3" "A4", "F4", "A5", "F5", "A6", "F6", "A7", "F7", "SD/4")
|
||||||
|
@ -112,6 +112,8 @@ class table_viewer (threading.Thread):
|
||||||
tmp.append(self.hudDivide(row[15],row[11])+" ("+str(row[11])+")") #AR
|
tmp.append(self.hudDivide(row[15],row[11])+" ("+str(row[11])+")") #AR
|
||||||
tmp.append(self.hudDivide(row[21],row[20])+" ("+str(row[20])+")") #FR
|
tmp.append(self.hudDivide(row[21],row[20])+" ("+str(row[20])+")") #FR
|
||||||
tmp.append(self.hudDivide(row[12],row[9])+" ("+str(row[9])+")") #SD/F
|
tmp.append(self.hudDivide(row[12],row[9])+" ("+str(row[9])+")") #SD/F
|
||||||
|
tmp.append(self.hudDivide(row[22],row[9])+" ("+str(row[9])+")") #W$wSF
|
||||||
|
tmp.append(self.hudDivide(row[23],row[12])+" ("+str(row[12])+")") #W$@SD
|
||||||
|
|
||||||
arr.append(tmp)
|
arr.append(tmp)
|
||||||
return arr
|
return arr
|
||||||
|
|
|
@ -93,6 +93,12 @@ print "otherRaisedTurn:",fields[2]
|
||||||
print "otherRaisedTurnFold:",fields[3]
|
print "otherRaisedTurnFold:",fields[3]
|
||||||
print "otherRaisedRiver:",fields[4]
|
print "otherRaisedRiver:",fields[4]
|
||||||
print "otherRaisedRiverFold:",fields[5]
|
print "otherRaisedRiverFold:",fields[5]
|
||||||
|
print ""
|
||||||
|
|
||||||
|
cursor.execute ("SELECT wonWhenSeenFlop, wonAtSD FROM HudDataHoldemOmaha WHERE id=%s", (hudDataId,))
|
||||||
|
fields=cursor.fetchone()
|
||||||
|
print "wonWhenSeenFlop:",fields[0]
|
||||||
|
print "wonAtSD:",fields[1]
|
||||||
|
|
||||||
|
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
This file is outdated!
|
||||||
|
|
||||||
Connected to MySQL on localhost. Print Hand Utility
|
Connected to MySQL on localhost. Print Hand Utility
|
||||||
options.site: Full Tilt Poker site_id: 1
|
options.site: Full Tilt Poker site_id: 1
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
This file is outdated!
|
||||||
|
|
||||||
Connected to MySQL on localhost. Print Hand Utility
|
Connected to MySQL on localhost. Print Hand Utility
|
||||||
options.site: Full Tilt Poker site_id: 1
|
options.site: Full Tilt Poker site_id: 1
|
||||||
From Table hands
|
From Table hands
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
This file is outdated!
|
||||||
|
|
||||||
Connected to MySQL on localhost. Print Hand Utility
|
Connected to MySQL on localhost. Print Hand Utility
|
||||||
options.site: Full Tilt Poker site_id: 1
|
options.site: Full Tilt Poker site_id: 1
|
||||||
From Table hands
|
From Table hands
|
||||||
|
|
|
@ -159,7 +159,7 @@ for i in range (len(hands_players)):
|
||||||
hands_actions=cursor.fetchall()
|
hands_actions=cursor.fetchall()
|
||||||
for j in range (len(hands_actions)):
|
for j in range (len(hands_actions)):
|
||||||
line=hands_actions[j][2:]
|
line=hands_actions[j][2:]
|
||||||
printstr="player_name:"+player_names[i]+" actionCount:"+str(j)
|
printstr="player_name:"+player_names[i]
|
||||||
printstr+=" street:"+ful.street_int2String(category, line[0])+" streetActionNo:"+str(line[1])+" action:"+line[2]
|
printstr+=" street:"+ful.street_int2String(category, line[0])+" streetActionNo:"+str(line[1])+" action:"+line[2]
|
||||||
printstr+=" amount:"+str(line[3])
|
printstr+=" amount:"+str(line[3])
|
||||||
print printstr
|
print printstr
|
||||||
|
|
Loading…
Reference in New Issue
Block a user