public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
scan.nextLine();
double d = scan.nextDouble();
scan.nextLine();
String s = scan.nextLine();
System.out.println("String: " + s);
System.out.println("Double: " + d);
System.out.println("Int: " + i);
}
В Python3 я могу сделать:
In [224]: txt = "Côte d'Ivoire"
In [225]: x = np.zeros((2,),dtype='U20')
In [226]: x[0] = txt
In [227]: x
Out[227]:
array(["Côte d'Ivoire", ''], dtype='<U20')
Это означает, что я, вероятно, мог бы открыть файл UTF-8 (обычный, а не байтовый режим) и строки чтения и назначить их элементам массив x
.
Но genfromtxt
настаивает на работе с байтовыми строками (ascii), которые не могут обрабатывать большой UTF-8
набор (7 байт v 8). Поэтому мне нужно применить decode
в какой-то момент, чтобы получить массив U
.
Я могу загрузить его в массив 'S' с помощью genfromtxt
:
In [258]: txt="Côte d'Ivoire"
In [259]: a=np.genfromtxt([txt.encode()],delimiter=',',dtype='S20')
In [260]: a
Out[260]:
array(b"C\xc3\xb4te d'Ivoire", dtype='|S20')
и примените decode
к отдельным элементам:
In [261]: print(a.item().decode())
Côte d'Ivoire
In [325]: print _
Côte d'Ivoire
Или используйте np.char.decode
, чтобы применить его к каждому элементу массива:
In [263]: np.char.decode(a)
Out[263]:
array("Côte d'Ivoire", dtype='<U13')
In [264]: print(_)
Côte d'Ivoire
genfromtxt
позволяет мне укажите converters
:
In [297]: np.genfromtxt([txt.encode()],delimiter=',',dtype='U20',
converters={0:lambda x: x.decode()})
Out[297]:
array("Côte d'Ivoire", dtype='<U20')
Если csv
имеет сочетание строк и цифр, этот converters
подход будет более простым в использовании, чем np.char.decode
. Просто укажите конвертер для каждого столбца строки.
(см. Мои предыдущие изменения для попыток Python2).