Не может определить, равна ли переменная, представляющая строку из файла csv, другой строке

#python #csv

#python #csv

Вопрос:

У меня есть файл csv с 3 столбцами, третий столбец содержит тип данных, которым является строка (Training / Publict / PrivateTest), и чтобы получить эти данные, я запускаю, затем я использую оператор if, чтобы проверить, равно ли использование ключевому слову, а затем выполнить некоторые действия, чтобыэто строка, если ее. По какой-то причине он не обнаружит использование, и когда-либо строка помечена usage, а правописание / заглавные буквы правильные, не уверен, что делать?

РЕДАКТИРОВАТЬ Поскольку этот файл csv предназначен для модели машинного обучения, над которой я сейчас работаю, он огромен, и было бы намного проще, если бы я предоставил ссылку: https://www.kaggle.com/ashishbansal23/emotion-recognition . Что касается комментариев относительно печати «использования» и т. Д., Я сделал это, И результатом было только слово Training, Publict или PrivateTest.

     for row in open(path):
        idx = 0
        real_idx = idx   1
        with open(path, "r") as c:
            emotion, image, usage = c.readlines()[real_idx].split(",")

            if usage == "Trainingn":
                train_labels.append(int(emotion))
                imageArr = []
                imageArr.append(image)
                train_images.append(imageArr)
                
    

            elif usage == "PublicTestn" or usage == "PrivateTestn":
                test_labels.append(int(emotion))
                imageArr = []
                imageArr.append(image)
                test_images.append(imageArr)
                

            else:
              print("This row was not assigned to any usage!")
            
            idx  = 1

    


def load_data():
    return train_images, train_labels, test_images, test_labels


format_data(path)
load_data()```

 

Комментарии:

1. Покажите нам первые несколько строк входного файла.

2. В качестве основного шага отладки вы пробовали печатать usage ?

3. как предлагали другие. лучше всего показать несколько строк примеров данных (могут быть анонимизированы / изменены, если это позволяет воспроизвести проблему) и показать, что вы ожидаете получить и что вы получаете с вашим текущим кодом. Используйте минимальное количество строк if, которые позволяют показать проблему

4. еще одна общая рекомендация. Если вы не уверены на 100%, что ваш csv-файл никогда не будет содержать строк с символами «,» или » n» или другими причудами, лучше использовать csv модуль ( docs.python.org/3/library/csv.html ) вместо использования простого «,» разделить. Обычно также рекомендуется, чтобы with open(.. формулировка была как можно короче. Два оператора if не требуют открытия файла, поэтому вы можете отменить их

5. возможно, причина в том, что пробелы содержатся в строках, и, как split(",") бы сохранить такие пробелы usage , имеют начальные или конечные пробелы. Итак, чтобы добавить к комментарию @John Gordon. Просто добавьте следующую строку для отладки print(repr(usage)) , которая покажет использование, но также четко укажет начальные или конечные пробелы.

Ответ №1:

Привет. Я бы прочитал файл CSV в строку [] следующим образом…

 string[] lines = File.ReadAllLines(@csv); // read all CSV lines
int limit = lines.count; // no. of rows
 

определите количество столбцов на основе «,» в первой строке

 System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex(",");
string fs = lines[0]; // First string in lines
n = rex.Matches(fs).Count; // how many "," in line
 

Затем получите количество строк и столбцов…

 int rows = limit   1; // no. of rows
int cols = oc   1; // no. of cols
public static string[,] table; // The CSV table
table = new string[rows, cols]; // CSV table [rows,cols]
 

Затем разбейте каждую строку на отдельные значения и сохраните их в таблице, таким образом, вы сможете проверять каждый элемент независимо

 string dummy = "";
string ts = "";
int p = 0;
for (int j = 0; j < rows; j  )
{
  ts = lines[r].Trim();
  for (int k = 1; k < cols; k  ) // break the line into its different parts
  {
    p = ts.IndexOf(","); // position of 1st comma
    if (p == -1)
    {
      if (ts != "" amp; ts != null)
        table[j, k] = ts.Trim().ToUpper();
      else
        table[j, k] = "X"; // insert an X if no data
      continue;
    }

    dummy = ts.Substring(0, p);
    table[j, k] = dummy.Trim.ToUpper();
  }
}
 

Там у вас есть массив [n, m] с отдельными значениями, которыми вы можете управлять