2015-10-18 8 views
0

Это функция у меня есть теперь для чтения двух различных CSV файлов:Как создать списки из CSV-файлов и литых колонках Интс и плавает

def readCSVfile(str1): 
    if str1 == 'small': 
     with open('small.csv', 'r+') as f: 
      read_small = csv.reader(f) 
      for row in read_small: 
       return read_small 
    elif str1 == 'big': 
     with open('big.csv', 'r+') as f: 
       read_big = csv.reader(f) 
       for row in read_big: 
        return read_big  
    else: 
     print "File not found" 

Небольшой файл отпечатанные выглядит так:

ответ

0

Для преобразования строк в int и float используются методы int() и float() соответственно. Демо может выглядеть следующим образом:

lst = ['1', '1', '2.2', '1.3', '9.6'] 
[int(x) if "." not in x else float(x) for x in lst] 

Выход:

[1, 1, 2.2, 1.3, 9.6] 

Возможное изменение кода:

def readCSVfile(str1): 
    if str1 == 'small': 
     with open('small.csv', 'r+') as f: 
      read_small = csv.reader(f) 
      next(read_small) # skip header 
      modified_data = [] 
      for row in read_small: 
       temp = [[int(x) if "." not in x else float(x) for x in row] # convert string elements to int and float elements 
       modified_data.append(temp) 
      return modified_data 
    # ... 

P.S. Более надежный способ преобразовать строку в целое или с плавающей точкой показывается в простом примере ниже:

def num(s): 
    try: 
     return int(s) 
    except ValueError: 
     return float(s) 

Для использования его изменить строку с TEMP:

temp = [num(x) for x in row] 

Вы можете легко изменить функцию num() работать в случае грязные данные, такие как "1." или что-то еще.

+0

мне нужно написать что-то, что работает для любого файла, вставленного в программе, которая структурирована таким же образом, как и мой пример выше –

+0

Потенциальная проблема с этим может заключаться в том, что если первые два столбца (которые означают '' '' '' '' '' '' '' '' '' '' '' '' ', то он будет беззвучно преобразован в' float' - что может или не может быть желаемым поведением. –

+1

@Gregg вы также можете быть явным: 'temp = [t (v) для t, v в zip ((int, int, float, float, float), строка)]' –

0

Если вы готовы установить панда, он будет делать то, что вы ожидаете:

>>> import pandas as pd 
>>> data = pd.read_csv('test.csv') 
>>> data.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 12 entries, 0 to 11 
Data columns (total 5 columns): 
site   12 non-null int64 
experiment 12 non-null int64 
length  12 non-null float64 
width   12 non-null float64 
height  12 non-null float64 
dtypes: float64(3), int64(2) 
memory usage: 576.0 bytes 
>>> print(data) 
    site experiment length width height 
0  1   1  2.2 1.3  9.6 
1  1   2  2.1 2.2  7.6 
2  1   3  2.7 1.5  2.2 
3  2   1  3.0 4.5  1.5 
4  2   2  3.1 3.1  4.0 
5  2   3  2.5 2.8  3.0 
6  3   1  1.9 1.8  4.5 
7  3   2  1.1 0.5  2.3 
8  3   3  3.5 2.0  7.5 
9  4   1  2.9 2.7  3.2 
10  4   2  4.5 4.8  6.5 
11  4   3  1.2 1.8  2.7 
+0

Интересно, я увижу, с расчетами, которые мне нужно сделать. –