Oct-18-2023, 12:50 AM
Hello all, I'm pretty unfamiliar with Python and am encountering an error with the attached code in writing the output data to a CSV. The idea is to read the needed data from a UV-vis UTF-8 style CSV and rewrite it with only the data I need. It grabs wavelength, and absorbance (Abs) from a series of trials, and gets time for each sample_name from the metadata. I can see that the data_row.extend operation does give the data i want, but it never appears in the CSV file. All of the other data does.
CSV input file is too big to include but i included xlsx file. I'm guessing/hoping this is something obvious with CSV writing that I've missed due to lack of experience. Note there are no errors reported with this code and it outputs the appropriate values in the terminal.
Thanks in advance and please let me know if I have formatted wrong. New to the code forum world. I'm just a codeworld-naive chemistry grad student.
CSV input file is too big to include but i included xlsx file. I'm guessing/hoping this is something obvious with CSV writing that I've missed due to lack of experience. Note there are no errors reported with this code and it outputs the appropriate values in the terminal.
Thanks in advance and please let me know if I have formatted wrong. New to the code forum world. I'm just a codeworld-naive chemistry grad student.
import csv def process_csv(input_file): # Initialize lists and dictionaries to store data sample_names = [] wavelength_data = [] # Store all rows of data abs_data = {} time_data = {} # Use a dictionary to store time data current_sample = None # Initialize current_sample outside of the loop seen_sample_names = set() # Keep track of sample names already processed with open(input_file, 'r', newline='') as csvfile: csvreader = csv.reader(csvfile) # Extract sample names and initialize data dictionaries headers = next(csvreader) sample_names = [headers[i] for i in range(0, len(headers), 2)] for name in sample_names: abs_data[name] = [] for i, row in enumerate(csvreader): if i < 2: continue # Skip the first two rows # Store all rows of data for later reference wavelength_data.append(row) if row[0] in sample_names and row[0] not in seen_sample_names: current_sample = row[0] seen_sample_names.add(current_sample) # Mark sample name as seen time_row = i + 35 # Move to the row exactly 36 rows higher time_col = 1 # Adjust this to the correct column index where time is located time_data[current_sample] = (time_row, time_col) # Split data into Abs values and append to the corresponding list in the data dictionary for name in sample_names: abs_data[name].append(row[headers.index(name) + 1]) # Create a list to store the output data output_data = [] for i in range(len(wavelength_data)): data_row = [wavelength_data[i][0], None] # Initialize time data with None for sample_name in sample_names: time_row, time_col = time_data.get(sample_name, (None, None)) if i == time_row: data_row[1] = wavelength_data[i][time_col] break data_row.extend(abs_data[name][i] for name in sample_names) output_data.append(data_row) # Create the output CSV file output_file = input_file.replace(".csv", "_output.csv") with open(output_file, 'w', newline='') as csvfile: csvwriter = csv.writer(csvfile) # Write the header row header_row = ["Wavelength (nm)", "Time (s)"] + sample_names csvwriter.writerow(header_row) # Write the data rows for data_row in output_data: csvwriter.writerow(data_row) print(f"Data extracted and saved to {output_file}") if __name__ == "__main__": input_file = "Fast scanning excess substrate Fe(II)TPP + O2 + 2eq ScHMPA + 1000eq SK 9t1 -60C.csv" # Replace with the path to your input CSV file process_csv(input_file)