1

I am trying to build a ticketing system in python, and the output should read the file column by column. However the program is misreading the columns. Any help would be greatly appreciated. Thank you

This is the expected output:

Name Age Sex
as   12  f
qw   13  m

Total Tickets:  2

And this is the current output:

Name    Age     Sex
as      qw
12      13
f       m

Total Tickets:  2

I am trying to create and write to a csv file and then read from it. However, as shown with the ouputs above, I am getting the opposite of the desired output

The code is as follows:

import sys, select, os, csv
from os import system

with open(input("\nInput file name with .csv extension: "), 'r', newline = '') as f:
    fileDir = os.path.dirname(os.path.realpath('__file__'))
    reader = csv.reader(f, delimiter = '\t')
    header_row = next(reader)
    
    # Can use the 2 lines below to check indices of headers
    # name = [0], age = [1], sex = [2]
    # for index, column_header in enumerate(header_row):
    #   print(index, column_header)

    name_l = []
    age_l = []
    sex_l = []

    total_tickets = 0

    for row in reader:
        name = str(row[0])
        name_l.append(name)
        age = str(row[1])
        age_l.append(age)
        sex = str(row[2])
        sex_l.append(sex)
        total_tickets += 1

print('\t'.join(header_row))
print('\t'.join(name_l))
print('\t'.join(age_l))
print('\t'.join(sex_l))
print("\nTotal Tickets: ", total_tickets)
1
  • Please provide a minimal reproducible example, not your entire program, so others can reproduce and help yo fix the problem. Commented Oct 20, 2021 at 21:09

2 Answers 2

1

Okay managed to figure it out for myself. So the new code is as follows:

import sys, select, os, csv
from os import system

with open(input("\nInput file name with .csv extension: "), 'r', newline = '') as f:

    fileDir = os.path.dirname(os.path.realpath('__file__'))
    reader = csv.reader(f, delimiter = '\t')
    header_row = next(reader)
    print('\t'.join(header_row))
    # Can use the 2 lines below to check indices of headers
    # name = [0], age = [1], sex = [2]
    # for index, column_header in enumerate(header_row):
    #   print(index, column_header)

    name_l = []
    age_l = []
    sex_l = []

    total_tickets = 0
    
    for row in reader:
        name = str(row[0])
        name_l.append(name)
        age = str(row[1])
        age_l.append(age)
        sex = str(row[2])
        sex_l.append(sex)
        total_tickets += 1

        print('\t'.join(row))
        
    print("\nTotal Tickets: ", total_tickets)
Sign up to request clarification or add additional context in comments.

1 Comment

Hey, I see you figured it out, great! Even took me a few looks to see what the problem was. I noticed your code doing extra work, so I answered with a minimal version that takes advantage of the csv reader and writer. Cheers!
1

I see you going through some steps that are unnecessary, and even caused the confusion that lead to your original problem.

Here's a minimal example that asks for user input, reads in and counts the rows, and then writes everything out:

import csv
import sys

fname = input('\nInput file name with .tsv extension: ')

total_tickets = 0

rows = []
with open(fname, newline='') as f:
    reader = csv.reader(f, delimiter='\t')
    rows.append(next(reader))  # read and add header

    for row in reader:
        rows.append(row)
        total_tickets += 1

writer = csv.writer(sys.stdout, delimiter='\t')
writer.writerows(rows)

print(f'\nTotal tickets: {total_tickets}')

Here's me running this:

% python3 so.py

Input file name with .tsv extension: so.tsv
Name    Age     Sex
as      12      f
qw      13      m

Total tickets: 2

The big takeaway is that there are two steps you can completely avoid:

  • string-converting all the cells is redundant, it's text coming in and text going out; if you just want to pass the data through, just append the whole row to rows, because...

  • writing the rows manually can be tricky as you saw, and csv.writer can do it for you

I reviewed the Python docs answering this, and I can see that there is no complete example where tabulated data is read in, processed, and then written out, so I can see how you got the idea to write your rows yourself.

Also, I'd never seen newline='', and was scratching my head till I saw the docs mention thats the way to do it... learned something new, thanks!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.