2016-04-04 2 views
-1

Я смотрю, могу ли я найти более эффективный способ написать это. Проблема с читателем csv заключается в том, что когда вы записываете вывод в стандартную версию, он бросает на него дополнительные одинарные кавычки. Изменение котировок никому не помогло, потому что оно не сохраняло форматирование.Очистите код или найдите более эффективные способы написания кода.

Этот код работает, но я чувствую, что могу сделать это более эффективно. Я действительно новичок в python и программировании.

import csv 
import sys 

def printString(x): 
    print x[0] + ",", x[1] + ",", x[2] + ",", x[3] + "," 

with open(sys.argv[1],"rb") as inputFile: 
    csvInput = csv.reader(inputFile, delimiter=',') 
    header = next(csvInput) 
    sort = sorted(csvInput, key=lambda x:float(x[3])) 

printString(header) 
for i in sort: 
    printString(i) 
+0

Вы видели ['csv.writer'] (https://docs.python.org/2/library/csv.html#csv.writer)? – user2357112

+0

У меня проблема, я не мог понять, какой способ писать, отправляя его на стандартный вывод вместо записи в файл. –

ответ

0

Я бы посмотрел на функцию string.join - вы можете использовать ее, указав строку, которую вы хотите использовать в качестве разделителя (в данном случае, запятую), вызывая .join на нем, а затем передавая в массив значения (в данном случае, значения из вашего CSVReader

>>> x = ['1.0', '2.0', '3.0'] 
>>> ','.join(x) 
1.0,2.0,3.0 

предупреждение -. присоединиться требует значения в массиве только быть строками (так что если вы хотите, чтобы делать какие-либо преобразования в Интс/поплавки для обработки, то вы могли бы хочу посмотреть на другие варианты, представленные здесь

1

Используйте этот способ:

def printString(x): 
    for field in x: 
     print "{0},".format(field) 
+1

Хотя этот фрагмент кода может решить проблему, [в том числе объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – MattDMo

+0

, чтобы немного разъяснить. Я хотел бы иметь возможность отправлять выходные данные в другой файл, если это необходимо, и иметь собственный файл csv. example: ./csvsort.py csvFile.csv> newCsvFile.csv –

1

Read Understanding repr() function in Python, это относится и к вашей "выход CSV": csv.reader производит списки строк в виде строк. Когда вы передаете список, как это print заявления, он печатает repr представления:

>>> print ["f1", "f2", "f3", "f4"] 
['f1', 'f2', 'f3', 'f4'] 

печать как функция пригодится в этом случае:

from __future__ import print_function 

for row in sort: 
    print(*row, sep=", ") 

Используя предыдущий пример:

>>> print(*["f1", "f2", "f3", "f4"], sep=", ") 
f1, f2, f3, f4 

Звездочка в этом контексте unpacks the list as positional arguments для печати.

0

Спасибо за помощь, вот что я решил пойти.

import csv 
import sys 

try: 
    with open(sys.argv[1],"rb") as inputFile: 
     csvInput = csv.reader(inputFile, delimiter=',') 
     header = next(csvInput) 
     sort = sorted(csvInput, key=lambda x:float(x[3])) 
    print(','.join(header)) 
    for i in sort: 
     print(','.join(i)) 

except: 
    print("Please input a csv file to sort, example: './dataSort.py csvFile.csv'" + \ 
       " the 4th column of the csv file needs to be a float or int variable.") 
Смежные вопросы