Python Numpy ndarray从文本跳过行 [英] Python numpy ndarray skipping lines from text
问题描述
基于此答案,我正在使用changethis
方法
import numpy as np
import os
def changethis(pos):
appex = sfile[pos[1]-1][:pos[2]] + '*' + file[pos[1]-1][pos[2]+len(pos[0]):]
file[pos[1]-1] = appex
pos = ('stack', 3, 16)
sfile = np.genfromtxt('in.cpp',dtype='str',delimiter=os.linesep)
changethis(pos)
print(file)
其中in.cpp
是包含以下内容的源文件:
where the in.cpp
is a source file which contains the following:
/* Multi-line
comment
*/
#include <iostream>
#include <fstream>
using namespace std;
int main (int argc, char *argv[]) {
int linecount = 0;
double array[1000], sum=0, median=0, add=0;
string filename;
if (argc <= 1)
{
cout << "Error" << endl;
return 0;
}
我得到输出:
['using namespace std;' 'int main (int argc, char *argv[]) {'
'int linecount = *' 'double array[1000], sum=0, median=0, add=0;'
'string filename;' 'if (argc <= 1)' '{' 'cout << "Error" << endl;'
'return 0;' '}']
请注意,ndarray
中缺少多行注释, include语句和空行
我不明白为什么会发生这种情况,因为delimiter
设置为考虑到每个换行字符.
I do not understand why this happens since the delimiter
is set to account for each change-of-line character.
关于如何输出的任何建议:
Any suggestions on how the output to be:
['/* Multi-line' 'comment' '*/' '' '#include <iostream>',
'' '#include <fstream>' '' 'using namespace std;'
'' 'int main (int argc, char *argv[]) {'
'int linecount = *' 'double array[1000], sum=0, median=0, add=0;'
'string filename;' 'if (argc <= 1)' '{' 'cout << "Error" << endl;'
'return 0;' '}']
推荐答案
再次抱歉使用genfromtxt
,不理解您的意图,只是尝试为该问题提供可能的解决方案.作为该特定解决方案(已提供其他解决方案)的后续操作,您可以执行以下操作:
Again sorry for the use of genfromtxt
, didn't understood your intentions, just tried to provide a possible solution for the problem. As a follow up for that particular solution (others have been provided) you can just do:
import numpy as np
import os
def changethis(pos):
# Notice file is in global scope
appex = file[pos[1]-1][:pos[2]] + '*' + file[pos[1]-1][pos[2]+len(pos[0]):]
file[pos[1]-1] = appex
pos = ('stack', 3, 16)
file = np.array([i for i in open('in.txt','r')]) # instead of genfromtext.
changethis(pos)
print(file)
,导致:
['/* Multi-line \n' 'comment\n' '*/\n*' '\n' '#include <iostream>\n'
'#include <fstream>\n' '\n' 'using namespace std;\n' '\n'
'int main (int argc, char *argv[]) {\n' ' int linecount = 0;\n'
' double array[1000], sum=0, median=0, add=0;\n' ' string filename;\n'
' if (argc <= 1)\n' ' {\n' ' cout << "Error" << endl;\n'
' return 0;\n' ' }']
另外,另一个用户提到的另一个要点是我用于文件的范围.我并不是要告诉您在全局范围内进行操作,而是要解释该功能正在工作,因为文件在全局范围内.无论如何,您都可以创建一个函数来保存范围:
Also another relevant point mentioned by another user is the scope I was using for file. I did not mean to tell you to do stuff in global scope, I meant to explain that the function was working because file was in global scope. In any case you can create a function to hold the scope:
import numpy as np
import os
def changeallthese(poslist,path):
def changethis(pos):
appex = file[pos[1]-1][:pos[2]-1] + '*' + file[pos[1]-1][pos[2]-1+len(pos[0]):]
file[pos[1]-1] = appex
file = np.array([str(i) for i in open(path,'r')])
for i in poslist:
changethis(i)
return file
poslist = [('stack', 3, 16),('stack', 18, 1),('/* Multi-line', 1, 1)]
file = changeallthese(poslist,'in.txt')
print(file)
,结果为:
['* \n' 'comment\n' '*/\n*' '\n' '#include <iostream>\n'
'#include <fstream>\n' '\n' 'using namespace std;\n' '\n'
'int main (int argc, char *argv[]) {\n' ' int linecount = 0;\n'
' double array[1000], sum=0, median=0, add=0;\n' ' string filename;\n'
' if (argc <= 1)\n' ' {\n' ' cout << "Error" << endl;\n'
' return 0;\n' '* }']
要向文件写入数组,您可以使用Python中的常规文件写入系统:
To write an array to file you can either use the normal file writing system in Python:
fid = open('out.txt','w')
fid.writelines(file)
fid.close()
,或者使用numpy中的函数(但是我不确定它是否会添加更多的结尾行,所以请小心):
, or use a function from numpy (but I'm not sure if it will add more endlines or not so be careful):
np.savetxt('out.txt',file,fmt='%s')
这篇关于Python Numpy ndarray从文本跳过行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!