5

I want to read a csv file from STDIN and operate on it.

The following is the code for reading the csv file and doing the operation needed. This works fine. But I want to take the input from STDIN.

import csv
with open('hospital_data.csv', 'rb') as csvfile:
    myDict = {}

    csvreader = csv.reader(csvfile, delimiter=',')
    for row in csvreader:
        if row[6] not in myDict.keys():
            #print 'Zipcode: ' + row[6] + ' Hospital code: ' + row[1]
            myDict[row[6]] = 1
        elif row[6] in myDict.keys():
            #print 'value in row '+ str(myDict[row[6]])
            myDict[row[6]] += 1

Is there a way in Python to read the file from STDIN as a csv file ?

2 Answers 2

13

csv.reader will take anything that yields lines, so you can use any of the methods shown at this answer to get lines from stdin: How do you read from stdin in Python?

I'm partial to fileinput myself due to its flexibility. EG:

import csv
import fileinput

myDict = {}
csvreader = csv.reader(fileinput.input(mode='rb'), delimiter=',')

But this works too:

import csv
import sys

myDict = {}
csvreader = csv.reader(sys.stdin, delimiter=',')

If you do that, you'll want to run with the -u command line argument to make stream binary, if that makes a difference on your platform: https://docs.python.org/2/using/cmdline.html#cmdoption-u

In either case you'll need to use control-D to mark the end of the input.

Note that the correct way to check if a key is in a dict is if row[6] in myDict rather than checking keys. And in fact if you just want a default value when the key is not present, use get:

for row in csvreader:
    myDict[row[6]] = myDict.get(row[6], 0) + 1

Or look into collections.Counter, since you're on 2.7:

myDict = collections.Counter(row[6] for row in csvreader)
Sign up to request clarification or add additional context in comments.

Comments

2

Use sys.stdin, it's file-like object.

import sys
import csv

data = sys.stdin.readlines()
csvreader = csv.reader(data, delimiter=',')
for row in csvreader:
    print row

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.