A1
được tải dưới dạng một mảng các chú thích. Python3 đã sử dụng các chuỗi unicode làm mặc định, vì vậy thường thêm chúng vào trước bằng 'b'. Điều đó là bình thường với print
. Tôi hơi ngạc nhiên rằng nó cũng như vậy trong quá trình viết tệp.
Trong mọi trường hợp, điều này dường như làm các trick:
A2=np.array([x.decode() for x in A1])
np.savetxt("Test.txt", A2, fmt='%s', delimiter=',')
A2
sẽ có một dtype như dtype='<U100'
.
mảng thử nghiệm của tôi là:
array([b'one.com', b'two.url', b'three.four'], dtype='|S10')
nạp từ một tập tin văn bản đơn giản:
one.com
two.url
three.four
.decode
là một phương pháp chuỗi. [x.decode() for x in A1]
hoạt động cho một mảng 1d đơn giản của bytestrings. Nếu A1
là 2d, việc lặp lại phải được thực hiện trên tất cả các phần tử, không chỉ các hàng. Và nếu A1
là mảng có cấu trúc, phải được áp dụng cho các chuỗi trong các phần tử.
Một khả năng khác là sử dụng một bộ chuyển đổi trong thời gian tải, vì vậy bạn sẽ có được một mảng của (unicode) chuỗi
In [508]: A1=np.loadtxt('urls.txt', dtype='U',
converters={0:lambda x:x.decode()})
In [509]: A1
Out[509]:
array(['one.com', 'two.url', 'three.four'], dtype='<U10')
In [510]: np.savetxt('test0.txt',A1,fmt='%s')
In [511]: cat test0.txt
one.com
two.url
three.four
Các lib chứa loadtxt
có một vài chức năng chuyển đổi, asbytes
, asbytes_nested
, và asstr
. Vì vậy, converters
cũng có thể là: converters={0:np.lib.npyio.asstr}
.
genfromtxt
xử lý này mà không converters
:
A1=np.genfromtxt('urls.txt', dtype='U')
# array(['one.com', 'two.url', 'three.four'], dtype='<U10')
Để hiểu tại sao savetxt
tiết kiệm chuỗi unicode như chúng ta muốn, nhưng gắn thêm các b
cho bytestrings, chúng ta phải nhìn vào mã của nó.
np.savetxt
(chạy trên py3) về cơ bản là:
fh = open(fname, 'wb')
X = np.atleast_2d(X).T
# make a 'fmt' that matches the columns of X (with delimiters)
for row in X:
fh.write(asbytes(format % tuple(row) + newline))
Nhìn vào hai chuỗi mẫu (str và bytestr):
In [617]: asbytes('%s'%tuple(['one.two']))
Out[617]: b'one.two'
In [618]: asbytes('%s'%tuple([b'one.two']))
Out[618]: b"b'one.two'"
Viết vào một tập tin 'wb' loại bỏ mà lớp ngoài của b''
, để phần bên trong cho dấu kiểm. Nó cũng giải thích tại sao các chuỗi ('plain' py3 unicode) được viết thành chuỗi 'latin1' vào tệp.
Bạn có thể viết trực tiếp một mảng bytestrings, không có savetxt
. Ví dụ:
A0 = array([b'one.com', b'two.url', b'three.four'], dtype='|S10')
with open('test0.txt','wb') as f:
for x in A0:
f.write(x+b'\n')
cat test0.txt
one.com
two.url
three.four
chuỗi Unicode cũng có thể được ghi trực tiếp, sản xuất cùng một tập tin:
A1 = array(['one.com', 'two.url', 'three.four'], dtype='<U10')
with open('test1.txt','w') as f:
for x in A1:
f.write(x+'\n')
Mã hóa mặc định cho một tập tin như vậy là encoding='UTF-8'
, giống như sử dụng với 'one.com'.encode()
. Ảnh hưởng của nó cũng giống như những gì savetxt
làm:
with open('test1.txt','wb') as f:
for x in A1:
f.write(x.encode()+b'\n')
np.char
có .encode
và .decode
phương pháp, mà có vẻ như hoạt động lặp đi lặp lại trên các yếu tố của một mảng.
Như vậy
np.char.decode(A1) # convert |S10 to <U10, like [x.decode() for x in A1]
np.char.encode(A1) # convert <U10 to |S10
này làm việc với mảng đa chiều
np.savetxt('testm.txt',np.char.decode(A_bytes[:,None][:,[0,0]]),
fmt='%s',delimiter=', ')
Với một mảng cấu trúc, np.char.decode
đã được áp dụng riêng cho từng lĩnh vực char.
Bạn có một biểu tượng. xem http://stackoverflow.com/questions/606191/convert-bytes-to-a-python-string –
Cảm ơn, tôi sẽ xem xét. Có điều gì tôi có thể làm cho phần định dạng của savetext để sửa chữa nó? – user2624599