Streamlit - IF statement depending on text_input - python
There is an error message (KeyError: '') for line 25,26 when the text inputs are empty but I can't manage to get rid of it. I want the variables Vec1 and Vec2 to be stored only when there exists a text input for both widgets. To run the code, you can load any xlsx table, like this one:
Var1
Var2
5
7
6
8
Here is my code
import numpy as np
import pandas as pd
import streamlit as st
st.set_page_config(layout="wide")
#Import file
xlsx_file = st.sidebar.file_uploader('Import File', type = 'xlsx')
#Select Variables of interest
Vec1Name = st.sidebar.text_input("First Variable Name")
Vec2Name = st.sidebar.text_input("Second Variable Name")
st.title('Data')
col1, col2 = st.columns((3,1))
if xlsx_file is not None:
df = pd.read_excel(xlsx_file)
col1.write(''' #### Dataframe''')
col1.write(df)
if all(var is not None for var in [Vec1Name, Vec2Name]):
#Store Variables
Vec1 = df[str(Vec1Name)]
Vec2 = df[str(Vec2Name)]
#Variables of Interest
col2.write(''' #### Variables of Interest''')
col2.write(df[[str(Vec1Name),str(Vec2Name)]])
Thank you for your help!
The error you're facing is because the text_input can not be found within df. If you know already that you want the input to be amongst the columns, why not use st.selectbox instead, and specify df.columns as options? Let me know if that code works better:
import numpy as np
import pandas as pd
import streamlit as st
st.set_page_config(layout="wide")
#Import file
xlsx_file = st.sidebar.file_uploader('Import File', type = 'xlsx')
st.title('Data')
col1, col2 = st.columns((3,1))
if xlsx_file is not None:
df = pd.read_excel(xlsx_file)
#Select Variables of interest
Vec1Name = st.sidebar.selectbox("First Variable Name", df.columns)
Vec2Name = st.sidebar.selectbox("Second Variable Name", df.columns)
col1.write(''' #### Dataframe''')
col1.write(df)
#Store Variables
Vec1 = df[str(Vec1Name)]
Vec2 = df[str(Vec2Name)]
#Variables of Interest
col2.write(''' #### Variables of Interest''')
col2.write(df[[str(Vec1Name),str(Vec2Name)]])
Related
Using a Tkinter button input to pass as argument
I'm using tkinter to create an option menu, where choosing an option will call a function specific to each option. However, I'm unable to figure out exactly how to do that. This is the code that is currently being used. import pandas as pd import os import matplotlib.pyplot as plt #below code imports file needed at the moment import tkinter as tk from tkinter import * from tkinter import filedialog import pandas as pd import os import matplotlib.pyplot as plt root = tk.Tk() root.withdraw() file_path = filedialog.askopenfilename() #will open file from any location, does not need to be in the same place as the code script df = pd.read_csv(file_path) df.rename(columns={'Unnamed: 0':'Type'}, inplace=True) #renames the first unnamed column to type (drug available (DA) or not available (NA) df.dropna(how = 'all', axis = 1, inplace = True) #drops the empty column present in each dataset, only drops it if the whole column is empty ##plotting functions for both active and inactive pokes def ActivePokes(df): plt.rcParams["figure.figsize"] = (12,7.5) df.plot() plt.xticks(range(0,len(df.Type)), df.Type) plt.ylabel("Number of Active Pokes") plt.xlabel("Sessions") plt.title("Number of Active Pokes vs Drug Availability") plt.show() def InactivePokes(df): plt.rcParams["figure.figsize"] = (12,7.5) df.plot() plt.xticks(range(0,len(df.Type)), df.Type) plt.ylabel("Number of Inactive Pokes") plt.xlabel("Sessions") plt.title("Number of Inactive Pokes vs Drug Availability") plt.show() def show(df): if variable == options[1]: button[command] = ActivePokes(df) elif variable == options[2]: button[command] = InactivePokes(df) else: print("Error!") options = [ "Choose Option", "1. Active pokes, Drug Available and No Drug Available sessions", "2. Inactive pokes, Drug Available and No Drug Available sessions"] button = Tk() button.title("Dialog Window") button.geometry('500x90') variable = StringVar(button) variable.set(options[0]) #default value, might change and edit as time passes option = OptionMenu(button, variable, *options, command = show) option.pack() button.mainloop() I know the show() function is where the issue lies, but I'm not entirely sure how to rectify it.
The other comments and answer address problems with creating two Tk objects and using .get() with a StringVar. The command = show callback is passed the string value of the item chosen. In your show( df ) when called from the Optionmenu will have df equal to one of the options. It won't be a pandas dataframe. Pure tkinter example below. import tkinter as tk root = tk.Tk() root.geometry( '100x100' ) var = tk.StringVar( value = 'Option A' ) def on_choice( chosen ): """ The callback function for an Optionmenu choice. chosen: The text value of the item chosen. """ print( chosen, end = " : " ) print( ' or from the StringVar: ', var.get() ) opt_list = [ 'Option A', 'Option B', 'Option C' ] options = tk.OptionMenu( root, var, *opt_list, command = on_choice ) options.grid() root.mainloop()
First problem, you have created a tk instance called root, and then another one called button,why? perhaps you want button to be a tk.Button and not a tk instance? Not sure what is the intention here. second, what is it command variable you want to change for button? (button[command]). if button where a tk.button, then perhaps you wanted to do button['command'] = ..., however, if the intention is to call the pokes functions why not calling them right away? third problem is here: def show(df): if variable == options[1]: button[command] = lambda: ActivePokes(df) elif variable == options[2]: button[command] = lambda: InactivePokes(df) else: print("Error!") change variable for variable.get()
'str' object has no attribute 'plot'
Consistently getting above stated error when I try to call a function using the tkinter button. So here is the example code used for this particular issue. import tkinter as tk from tkinter import * from tkinter import filedialog import pandas as pd import os import matplotlib.pyplot as plt root = tk.Tk() root.withdraw() file_path = filedialog.askopenfilename() #will open file from any location, does not need to be in the same place as the code script df = pd.read_csv(file_path) df.rename(columns={'Unnamed: 0':'Type'}, inplace=True) #renames the first unnamed column to type (drug available (DA) or not available (NA) df.dropna(how = 'all', axis = 1, inplace = True) #drops the empty column present in each dataset, only drops it if the whole column is empty ##plotting functions for both active and inactive pokes def ActivePokes(df): df.plot(figsize = (12,7.5), xlabel = 'Number of active pokes', ylabel = 'Sessions', title = 'Number of Active Pokes vs Drug Availability') plt.xticks(range(0,len(df.Type)), df.Type) def InactivePokes(df): plt.rcParams["figure.figsize"] = (12,7.5) df.plot() plt.xticks(range(0,len(df.Type)), df.Type) plt.ylabel("Number of Inactive Pokes") plt.xlabel("Sessions") plt.title("Number of Inactive Pokes vs Drug Availability") plt.show() def show(df): if variable.get() == options[1]: ActivePokes(df) elif variable.get() == options[2]: InactivePokes(df) else: print("Error!") options = [ "Choose Option", "1. Active pokes, Drug Available and No Drug Available sessions", "2. Inactive pokes, Drug Available and No Drug Available sessions"] button = Tk() button.title("Dialog Window") button.geometry('500x90') variable = StringVar(button) variable.set(options[0]) #default value, might change and edit as time passes option = OptionMenu(button, variable, *options, command = show) option.pack() button.mainloop() However, the error I keep receiving is this: Is there any way this can be rectified and I can still produce the graphs needed while using the tkinter button?
The option Menu automatically passes the selected option to the command. Since you named the argument df in the function, the logical connection is df = contentained_string_of_optionmenu in the namespace of your function. However, since df origionally is a dataframe, you should just have to rename the argument/parameter of your function like: def show(opt): In addition it makes the StringVar useless since you can do: if opt == options[1]: ActivePokes(df) elif opt == options[2]: InactivePokes(df) else: print("Error!") You might also choose to clear the argument df elsewhere since it's in the global namespace.
How can I save the headers and values in Html <script> as a table in the csv file?
I'm new to writing code. Using slenium and beautifulsoup, I managed to reach the script I want among dozens of scripts on the web page. I am looking for script [17]. When these codes are executed, the script [17] gives a result as follows. the last part of my codes html=driver.page_source soup=BeautifulSoup(html, "html.parser") scripts=soup.find_all("script") x=scripts[17] print(x) result, output note: The list of dates is ahead of the script [17]. slide the bar. Dummy Data Dummy Data <script language="JavaScript"> var theHlp='/yardim/matris.asp';var theTitle = 'Piyasa Değeri';var theCaption='Cam (TL)';var lastmod = '';var h='<a class=hisselink href=../Hisse/HisseAnaliz.aspx?HNO=';var e='<a class=hisselink href=../endeks/endeksAnaliz.aspx?HNO=';var d='<center><font face=symbol size=1 color=#FF0000><b>ß</b></font></center>';var u='<center><font face=symbol size=1 color=#008000><b>İ</b></font></center>';var n='<center><font face=symbol size=1 color=#00A000><b>=</b></font></center>';var fr='<font color=#FF0000>';var fg='<font color=#008000>';var theFooter=new Array();var theCols = new Array();theCols[0] = new Array('Hisse',4,50);theCols[1] = new Array('2012.12',1,60);theCols[2] = new Array('2013.03',1,60);theCols[3] = new Array('2013.06',1,60);theCols[4] = new Array('2013.09',1,60);theCols[5] = new Array('2013.12',1,60);theCols[6] = new Array('2014.03',1,60);theCols[7] = new Array('2014.06',1,60);theCols[8] = new Array('2014.09',1,60);theCols[9] = new Array('2014.12',1,60);theCols[10] = new Array('2015.03',1,60);theCols[11] = new Array('2015.06',1,60);theCols[12] = new Array('2015.09',1,60);theCols[13] = new Array('2015.12',1,60);theCols[14] = new Array('2016.03',1,60);theCols[15] = new Array('2016.06',1,60);theCols[16] = new Array('2016.09',1,60);theCols[17] = new Array('2016.12',1,60);theCols[18] = new Array('2017.03',1,60);theCols[19] = new Array('2017.06',1,60);theCols[20] = new Array('2017.09',1,60);theCols[21] = new Array('2017.12',1,60);theCols[22] = new Array('2018.03',1,60);theCols[23] = new Array('2018.06',1,60);theCols[24] = new Array('2018.09',1,60);theCols[25] = new Array('2018.12',1,60);theCols[26] = new Array('2019.03',1,60);theCols[27] = new Array('2019.06',1,60);theCols[28] = new Array('2019.09',1,60);theCols[29] = new Array('2019.12',1,60);theCols[30] = new Array('2020.03',1,60);var theRows = new Array(); theRows[0] = new Array ('<b>'+h+'30>ANA</B></a>','1,114,919,783.60','1,142,792,778.19','1,091,028,645.38','991,850,000.48','796,800,000.38','697,200,000.34','751,150,000.36','723,720,000.33','888,000,000.40','790,320,000.36','883,560,000.40','927,960,000.42','737,040,000.33','879,120,000.40','914,640,000.41','927,960,000.42','1,172,160,000.53','1,416,360,000.64','1,589,520,000.72','1,552,500,000.41','1,972,500,000.53','2,520,000,000.67','2,160,000,000.58','2,475,000,000.66','2,010,000,000.54','2,250,000,000.60','2,077,500,000.55','2,332,500,000.62','3,270,000,000.87','2,347,500,000.63'); theRows[1] = new Array ('<b>'+h+'89>DEN</B></a>','55,200,000.00','55,920,000.00','45,960,000.00','42,600,000.00','35,760,000.00','39,600,000.00','40,200,000.00','47,700,000.00','50,460,000.00','45,300,000.00','41,760,000.00','59,340,000.00','66,600,000.00','97,020,000.00','81,060,000.00','69,300,000.00','79,800,000.00','68,400,000.00','66,900,000.00','66,960,000.00','71,220,000.00','71,520,000.00','71,880,000.00','60,600,000.00','69,120,000.00','62,640,000.00','57,180,000.00','89,850,000.00','125,100,000.00','85,350,000.00'); theRows[2] = new Array ('<b>'+h+'269>SIS</B></a>','4,425,000,000.00','4,695,000,000.00','4,050,000,000.00','4,367,380,000.00','4,273,120,000.00','3,644,720,000.00','4,681,580,000.00','4,913,000,000.00','6,188,000,000.00','5,457,000,000.00','6,137,000,000.00','5,453,000,000.00','6,061,000,000.00','6,954,000,000.00','6,745,000,000.00','6,519,000,000.00','7,851,500,000.00','8,548,500,000.00','9,430,000,000.00','9,225,000,000.00','10,575,000,000.00','11,610,000,000.00','9,517,500,000.00','13,140,000,000.00','12,757,500,000.00','13,117,500,000.00','11,677,500,000.00','10,507,500,000.00','11,857,500,000.00','9,315,000,000.00'); theRows[3] = new Array ('<b>'+h+'297>TRK</B></a>','1,692,579,200.00','1,983,924,800.00','1,831,315,200.00','1,704,000,000.00','1,803,400,000.00','1,498,100,000.00','1,803,400,000.00','1,884,450,000.00','2,542,160,000.00','2,180,050,000.00','2,069,200,000.00','1,682,600,000.00','1,619,950,000.00','1,852,650,000.00','2,040,600,000.00','2,315,700,000.00','2,641,200,000.00','2,938,800,000.00','3,599,100,000.00','4,101,900,000.00','5,220,600,000.00','5,808,200,000.00','4,689,500,000.00','5,375,000,000.00','3,787,500,000.00','4,150,000,000.00','3,662,500,000.00','3,712,500,000.00','4,375,000,000.00','3,587,500,000.00'); var thetable=new mytable();thetable.tableWidth=650;thetable.shownum=false;thetable.controlaccess=true;thetable.visCols=new Array(true,true,true,true,true);thetable.initsort=new Array(0,-1);thetable.inittable();thetable.refreshTable();</script> My purpose is to extract this output into a table and save it as a csv file. How can i extract this script as i want? all dates should be on top, all names should be on the far right, all values should be between the two. Hisse 2012.12 2013.3 2013.4 ... ANA 1,114,919,783.60 1,142,792,778.19 1,091,028,645.38 ... DEN 55,200,000.00 55,920,000.00 45,960,000.00 .... . . .
Solution The custom-function process_scripts() will produce what you are looking for. I am using the dummy data given below (at the end). First we check that the code does what it is expected and so we create a pandas dataframe to see the output. You could also open this Colab Jupyter Notebook and run it on Cloud for free. This will allow you to not worry about any installation or setup and simply focus on examining the solution itself. 1. Processing A Single Script ## Define CSV file-output folder-path OUTPUT_PATH = './output' ## Process scripts dfs = process_scripts(scripts = [s], output_path = OUTPUT_PATH, save_to_csv = False, verbose = 0) print(dfs[0].reset_index(drop=True)) Output: Name 2012.12 ... 2019.12 2020.03 0 ANA 1,114,919,783.60 ... 3,270,000,000.87 2,347,500,000.63 1 DEN 55,200,000.00 ... 125,100,000.00 85,350,000.00 2 SIS 4,425,000,000.00 ... 11,857,500,000.00 9,315,000,000.00 3 TRK 1,692,579,200.00 ... 4,375,000,000.00 3,587,500,000.00 [4 rows x 31 columns] 2. Processing All the Scripts You can process all your scripts using the custom-define function process_scripts(). The code is given below. ## Define CSV file-output folder-path OUTPUT_PATH = './output' ## Process scripts dfs = process_scripts(scripts, output_path = OUTPUT_PATH, save_to_csv = True, verbose = 0) ## To clear the output dir-contents #!rm -f $OUTPUT_PATH/* I did this on Google Colab and it worked as expected. 3. Making Paths in OS-agnostic Manner Making paths for windows or unix based systems could be very different. The following shows you a method to achieve that without having to worry about which OS you will run the code. I have used the os library here. However, I would suggest you to look at the Pathlib library as well. # Define relative path for output-folder OUTPUT_PATH = './output' # Dynamically define absolute path pwd = os.getcwd() # present-working-directory OUTPUT_PATH = os.path.join(pwd, os.path.abspath(OUTPUT_PATH)) 4. Code: custom function process_scripts() Here we use the regex (regular expression) library, along with pandas for organizing the data in a tabular format and then writing to csv file. The tqdm library is used to give you a nice progressbar while processing multiple scripts. Please see the comments in the code to know what to do if you are running it not from a jupyter notebook. The os library is used for path manipulation and creation of output-directory. #pip install -U pandas #pip install tqdm import pandas as pd import re # regex import os from tqdm.notebook import tqdm # Use the following line if not using a jupyter notebook # from tqdm import tqdm def process_scripts(scripts, output_path='./output', save_to_csv: bool=False, verbose: int=0): """Process all scripts and return a list of dataframes and optionally write each dataframe to a CSV file. Parameters ---------- scripts: list of scripts output_path (str): output-folder-path for csv files save_to_csv (bool): default is False verbose (int): prints output for verbose>0 Example ------- OUTPUT_PATH = './output' dfs = process_scripts(scripts, output_path = OUTPUT_PATH, save_to_csv = True, verbose = 0) ## To clear the output dir-contents #!rm -f $OUTPUT_PATH/* """ ## Define regex patterns and compile for speed pat_header = re.compile(r"theCols\[\d+\] = new Array\s*\([\'](\d{4}\.\d{1,2})[\'],\d+,\d+\)") pat_line = re.compile(r"theRows\[\d+\] = new Array\s*\((.*)\).*") pat_code = re.compile("([A-Z]{3})") # Calculate zfill-digits zfill_digits = len(str(len(scripts))) print(f'Total scripts: {len(scripts)}') # Create output_path if not os.path.exists(output_path): os.makedirs(output_path) # Define a list of dataframes: # An accumulator of all scripts dfs = [] ## If you do not have tqdm installed, uncomment the # next line and comment out the following line. #for script_num, script in enumerate(scripts): for script_num, script in enumerate(tqdm(scripts, desc='Scripts Processed')): ## Extract: Headers, Rows # Rows : code (Name: single column), line-data (multi-column) headers = script.strip().split('\n', 0)[0] headers = ['Name'] + re.findall(pat_header, headers) lines = re.findall(pat_line, script) codes = [re.findall(pat_code, line)[0] for line in lines] # Clean data for each row lines_data = dict() for line, code in zip(lines, codes): line_data = line.replace("','", "|").split('|') line_data[-1] = line_data[-1].replace("'", "") line_data[0] = code lines_data.update({code: line_data.copy()}) if verbose>0: print('{}: {}'.format(script_num, codes)) ## Load data into a pandas-dataframe # and write to csv. df = pd.DataFrame(lines_data).T df.columns = headers dfs.append(df.copy()) # update list # Write to CSV if save_to_csv: num_label = str(script_num).zfill(zfill_digits) script_file_csv = f'Script_{num_label}.csv' script_path = os.path.join(output_path, script_file_csv) df.to_csv(script_path, index=False) return dfs 5. Dummy Data ## Dummy Data s = """ <script language="JavaScript"> var theHlp='/yardim/matris.asp';var theTitle = 'Piyasa Değeri';var theCaption='Cam (TL)';var lastmod = '';var h='<a class=hisselink href=../Hisse/HisseAnaliz.aspx?HNO=';var e='<a class=hisselink href=../endeks/endeksAnaliz.aspx?HNO=';var d='<center><font face=symbol size=1 color=#FF0000><b>ß</b></font></center>';var u='<center><font face=symbol size=1 color=#008000><b>İ</b></font></center>';var n='<center><font face=symbol size=1 color=#00A000><b>=</b></font></center>';var fr='<font color=#FF0000>';var fg='<font color=#008000>';var theFooter=new Array();var theCols = new Array();theCols[0] = new Array('Hisse',4,50);theCols[1] = new Array('2012.12',1,60);theCols[2] = new Array('2013.03',1,60);theCols[3] = new Array('2013.06',1,60);theCols[4] = new Array('2013.09',1,60);theCols[5] = new Array('2013.12',1,60);theCols[6] = new Array('2014.03',1,60);theCols[7] = new Array('2014.06',1,60);theCols[8] = new Array('2014.09',1,60);theCols[9] = new Array('2014.12',1,60);theCols[10] = new Array('2015.03',1,60);theCols[11] = new Array('2015.06',1,60);theCols[12] = new Array('2015.09',1,60);theCols[13] = new Array('2015.12',1,60);theCols[14] = new Array('2016.03',1,60);theCols[15] = new Array('2016.06',1,60);theCols[16] = new Array('2016.09',1,60);theCols[17] = new Array('2016.12',1,60);theCols[18] = new Array('2017.03',1,60);theCols[19] = new Array('2017.06',1,60);theCols[20] = new Array('2017.09',1,60);theCols[21] = new Array('2017.12',1,60);theCols[22] = new Array('2018.03',1,60);theCols[23] = new Array('2018.06',1,60);theCols[24] = new Array('2018.09',1,60);theCols[25] = new Array('2018.12',1,60);theCols[26] = new Array('2019.03',1,60);theCols[27] = new Array('2019.06',1,60);theCols[28] = new Array('2019.09',1,60);theCols[29] = new Array('2019.12',1,60);theCols[30] = new Array('2020.03',1,60);var theRows = new Array(); theRows[0] = new Array ('<b>'+h+'30>ANA</B></a>','1,114,919,783.60','1,142,792,778.19','1,091,028,645.38','991,850,000.48','796,800,000.38','697,200,000.34','751,150,000.36','723,720,000.33','888,000,000.40','790,320,000.36','883,560,000.40','927,960,000.42','737,040,000.33','879,120,000.40','914,640,000.41','927,960,000.42','1,172,160,000.53','1,416,360,000.64','1,589,520,000.72','1,552,500,000.41','1,972,500,000.53','2,520,000,000.67','2,160,000,000.58','2,475,000,000.66','2,010,000,000.54','2,250,000,000.60','2,077,500,000.55','2,332,500,000.62','3,270,000,000.87','2,347,500,000.63'); theRows[1] = new Array ('<b>'+h+'89>DEN</B></a>','55,200,000.00','55,920,000.00','45,960,000.00','42,600,000.00','35,760,000.00','39,600,000.00','40,200,000.00','47,700,000.00','50,460,000.00','45,300,000.00','41,760,000.00','59,340,000.00','66,600,000.00','97,020,000.00','81,060,000.00','69,300,000.00','79,800,000.00','68,400,000.00','66,900,000.00','66,960,000.00','71,220,000.00','71,520,000.00','71,880,000.00','60,600,000.00','69,120,000.00','62,640,000.00','57,180,000.00','89,850,000.00','125,100,000.00','85,350,000.00'); theRows[2] = new Array ('<b>'+h+'269>SIS</B></a>','4,425,000,000.00','4,695,000,000.00','4,050,000,000.00','4,367,380,000.00','4,273,120,000.00','3,644,720,000.00','4,681,580,000.00','4,913,000,000.00','6,188,000,000.00','5,457,000,000.00','6,137,000,000.00','5,453,000,000.00','6,061,000,000.00','6,954,000,000.00','6,745,000,000.00','6,519,000,000.00','7,851,500,000.00','8,548,500,000.00','9,430,000,000.00','9,225,000,000.00','10,575,000,000.00','11,610,000,000.00','9,517,500,000.00','13,140,000,000.00','12,757,500,000.00','13,117,500,000.00','11,677,500,000.00','10,507,500,000.00','11,857,500,000.00','9,315,000,000.00'); theRows[3] = new Array ('<b>'+h+'297>TRK</B></a>','1,692,579,200.00','1,983,924,800.00','1,831,315,200.00','1,704,000,000.00','1,803,400,000.00','1,498,100,000.00','1,803,400,000.00','1,884,450,000.00','2,542,160,000.00','2,180,050,000.00','2,069,200,000.00','1,682,600,000.00','1,619,950,000.00','1,852,650,000.00','2,040,600,000.00','2,315,700,000.00','2,641,200,000.00','2,938,800,000.00','3,599,100,000.00','4,101,900,000.00','5,220,600,000.00','5,808,200,000.00','4,689,500,000.00','5,375,000,000.00','3,787,500,000.00','4,150,000,000.00','3,662,500,000.00','3,712,500,000.00','4,375,000,000.00','3,587,500,000.00'); var thetable=new mytable();thetable.tableWidth=650;thetable.shownum=false;thetable.controlaccess=true;thetable.visCols=new Array(true,true,true,true,true);thetable.initsort=new Array(0,-1);thetable.inittable();thetable.refreshTable();</script> """ ## Make a dummy list of scripts scripts = [s for _ in range(10)]
According to the provided <script> in your question, you can do something like code below to have a list of Dates for each name ANA, DEN ..: for _ in range(1, len(aaa.split("<b>'"))-1): s = aaa.split("<b>'")[_].split("'") print(_) lst = [] for i in s: if "</B>" in i: name = i.split('>')[1].split("<")[0] print("{} = ".format(name), end="") if any(j.isdigit() for j in i) and ',' in i: lst.append(i) print(lst) It's just an example code, so it's not that beautiful :) Hope this will help you.
Python: correct format on input to datagridview
I want to add rows to a datagridview "manually". I tried converting the following code to python: https://learn.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-manipulate-rows-in-the-windows-forms-datagridview-control However, I struggle with adding rows. The following doesn't work: for j in range(len(signals)): self._dataGridView1.Rows.Add(signals[j]) The following code does work, but is not dynamically enough as I don't know how many elements there will be: for j in range(len(signals)): self._dataGridView1.Rows.Add(signals[j][0], signals[j][1], signals[j][2], signals[j][3]) How should I fix this? I tried tuple, but the result were a tuple with all the info shown in the first cell instead of spread over the columns. I would not like to add packages, as this is to be run within revid dynamo among several users, and I cannot convince everyone to install packages. full code for context: import clr clr.AddReference('System.Windows.Forms') clr.AddReference('System.Drawing') clr.AddReference('System.Data') clr.AddReference('RevitAPIUI') from Autodesk.Revit.UI import TaskDialog from System.Windows.Forms import * from System.Drawing import ( Point, Size, Font, FontStyle, GraphicsUnit ) from System.Data import DataSet from System.Data.Odbc import OdbcConnection, OdbcDataAdapter msgBox = TaskDialog headers = IN[0] signals = IN[1] class DataGridViewQueryForm(Form): def __init__(self): self.Text = 'Signals' self.ClientSize = Size(942, 255) self.MinimumSize = Size(500, 200) self.setupDataGridView() def setupDataGridView(self): self._dataGridView1 = DataGridView() self._dataGridView1.AllowUserToOrderColumns = True self._dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize self._dataGridView1.Dock = DockStyle.Fill self._dataGridView1.Location = Point(0, 111) self._dataGridView1.Size = Size(506, 273) self._dataGridView1.TabIndex = 3 self._dataGridView1.ColumnCount = len(headers) self._dataGridView1.ColumnHeadersVisible = True for i in range(len(headers)): self._dataGridView1.Columns[i].Name = headers[i] for j in range(len(signals)): self._dataGridView1.Rows.Add(signals[j][0], signals[j][1], signals[j][2], signals[j][3]) self.Controls.Add(self._dataGridView1) Application.Run(DataGridViewQueryForm())
Figured it out. Had to use System.Array. from System import Array code changes: array_str = Array.CreateInstance(str, len(headers)) for j in range(len(signals)): for k in range(len(headers)): array_str[k] = signals[j][k] self._dataGridView1.Rows.Add(array_str)
Not able to save .xlsx file on local which I am trying to create/generate using XlsXcessive python
While running following sample code I am getting error as "save is not defined." That is why I added from xlsxcessive.xlsx import save. But still it is not able to save on local machine. Is this error of Python API or am I doing any mistake in Coding? """Just a simple example of XlsXcessive API usage.""" from xlsxcessive.xlsx import Workbook from xlsxcessive.worksheet import Cell **from xlsxcessive.xlsx import save** import decimal wb = Workbook() sheet = wb.new_sheet('Test Sheet') # a shared format bigguy = wb.stylesheet.new_format() bigguy.font(size=24) bigguy.align('center') # add a border bigguy.border(top="medium", bottom="medium") # set a builtin number format bigguy.number_format('0.00') # another shared format boldfont = wb.stylesheet.new_format() boldfont.font(bold=True) # and another highprec = wb.stylesheet.new_format() # set a custom number format on the shared format highprec.number_format("0.000") # the API supports adding rows row1 = sheet.row(1) # rows support adding cells - cells can currently store strings, numbers # and formulas. a1 = row1.cell("A1", "Hello, World!", format=boldfont) row1.cell("C1", 42.0, format=bigguy) # cells can be merged with other cells - there is no checking on invalid merges # though. merge at your own risk! a1.merge(Cell('B1')) # adding rows is easy row2 = sheet.row(2) row2.cell("B2", "Foo") row2.cell("C2", 1, format=bigguy) # formulas are written as strings and can have default values shared_formula = sheet.formula("SUM(C1, C2)", 43.0, shared=True) row3 = sheet.row(3) row3.cell("C3", shared_formula, format=bigguy) # you can work with cells directly on the sheet sheet.cell('D1', 12.0005, format=highprec) sheet.cell('D2', 11.9995, format=highprec) sheet.cell('D3', shared_formula, format=highprec) # and directly via row and column indicies sheet.cell(coords=(0, 4), value=40) sheet.cell(coords=(1, 4), value=2) sheet.cell(coords=(2, 4), value=shared_formula) # you can share a formula in a non-contiguous range of cells times_two = sheet.formula('PRODUCT(A4, 2)', shared=True) sheet.cell('A4', 12) sheet.cell('B4', times_two) sheet.cell('C4', 50) sheet.cell('D4', times_two) # iteratively adding data is easy now for rowidx in xrange(5,10): for colidx in xrange(5, 11, 2): sheet.cell(coords=(rowidx, colidx), value=rowidx*colidx) # set column widths sheet.col(2, width=5) # write unicode value sheet.cell('G2', value=u"43\u00b0") if __name__ == '__main__': import os import sys from xlsxcessive.xlsx import save if len(sys.argv) == 1: print "USAGE: python sample.py NEWFILEPATH" print "Writes a sample .xlsx file to NEWFILEPATH" raise SystemExit(1) if os.path.exists(sys.argv[1]): print "Aborted. File %s already exists." % sys.argv[1] raise SystemExit(1) stream = None if sys.argv[1] == '-': stream = sys.stdout # wb is the Workbook created above save(wb, sys.argv[1], stream) Note: Tried following also # local file save(workbook, 'financials.xlsx') # stream save(workbook, 'financials.xlsx', stream=sys.stdout)