Вы можете использовать json_decode () для преобразования строки json в объект / массив PHP.
Например.
Вход:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
Выход:
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
Несколько точек для запоминания:
json_decode
требует, чтобы строка была действительной json
, иначе она вернется NULL
. json_last_error()
можно использовать для определения точного характера ошибки. utf8
контент, или json_decode
может выйти из строя и просто вернуть значение NULL
. Допустим, вы открываете файл с помощью оператора with
, как и должно быть. Затем вы сделаете что-то подобное для чтения из вашего файла:
with open('somefile.txt', 'w+') as f:
# Note that f has now been truncated to 0 bytes, so you'll only
# be able to read data that you wrote earlier...
f.write('somedata\n')
f.seek(0) # Important: return to the top of the file before reading, otherwise you'll just read an empty string
data = f.read() # Returns 'somedata\n'
Обратите внимание на f.seek(0)
- если вы забудете об этом, вызов f.read()
попытается прочитать с конца файл и вернет пустую строку.
Все режимы файла в Python
r
для чтения r+
открывается для чтения и записи (невозможно обрезать файл) w
для записи w+
для записи и чтения (может обрезать файл) rb
для чтения двоичного файла. Указатель файла помещается в начало файла. rb+
чтение или запись двоичного файла wb+
запись двоичного файла a+
открывается для добавления ab+
Открывает файл для добавления и чтения в двоичном формате. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. x
открыт для исключительного создания, если файл уже существует (Python 3) rb
и wb
, не говоря уже о режимах U
в режимах 2.x и t
в 3.x (которые могут быть объединены со всем, кроме b
).
– abarnert
4 August 2014 в 10:30
wb+
также читается из файла?
– Celeritas
17 July 2015 в 19:53
Я подозреваю, что есть два способа справиться с тем, что, как я думаю, вы пытаетесь достичь.
1), что очевидно, открывает файл только для чтения, читает его в памяти и открывает файл с помощью t, затем запишите свои изменения.
2) используйте подпрограммы обработки файлов низкого уровня:
# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
fd = os.open(filename, os.O_RDWR | os.O_CREAT)
Надеюсь, это поможет ..
Файл усечен, поэтому вы можете вызывать read()
(никаких исключений не было, в отличие от того, что было открыто с помощью «w»), но вы получите пустую строку.
На самом деле, что-то не так во всех остальных ответах в режиме r+
.
test.in
содержимое файла:
hello1
ok2
byebye3
И сценарий py:
with open("test.in", 'r+')as f:
f.readline()
f.write("addition")
Выполните его, и содержимое test.in
будет изменено на:
hello1
ok2
byebye3
addition
Однако, когда мы модифицируем скрипт на:
with open("test.in", 'r+')as f:
f.write("addition")
test.in
также реагируют:
additionk2
byebye3
Таким образом, режим r+
позволит нам покрывать контент с самого начала, если мы не выполнили операцию чтения. И если мы выполним некоторую операцию чтения, f.write()
просто добавит файл.
Кстати, если мы f.seek(0,0)
до f.write(write_content)
, write_content будет покрывать их из positon (0, 0).
w+
создает новый файл или обрезает существующий файл, затем открывает его для чтения и записи; r+
открывает существующий файл без усечения его для чтения и записи. Очень разные.
– abarnert
4 August 2014 в 10:31
r
, w
или a
являются исключительными, но b
могут быть добавлены к любому из них, также как +
или U
... Это комбинаторный взрыв.
– rmunn
3 October 2014 в 07:41
rb
не является режимом по умолчанию, цитата: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r'
docs.python.org/2/library/functions.html#open
– iggy
27 July 2015 в 11:33
w+
будет «перезаписывать существующий файл, если файл существует». Итак, как только вы откроете файл сw+
, теперь это пустой файл: он содержит 0 байт. Если он использовался для хранения данных, эти данные были усечены - обрезаны и выброшены - и теперь размер файла равен 0 байтам, поэтому вы не можете прочитать какие-либо данные, которые существовали до i>, которые вы открыли файл сw+
. Если вы действительно хотели прочитать предыдущие данные и добавить к ним, вы должны использоватьr+
вместоw+
. – rmunn 6 January 2018 в 09:33